Найти тему
КСОР АЙТИ [XORit]

ChatGPT, может Игру Жизнь? Путешествие по бесконечным мирам клеточных автоматов

Иллюстрация Midjourney
Иллюстрация Midjourney

Игра Жизнь – это клеточный автомат, который был придуман британским математиком Джоном Хортоном Конвеем в 1970 году. Несмотря на то, что это не игра в традиционном смысле слова, она предлагает бесконечные возможности для изучения и экспериментов, связанных с моделированием эволюции и анализом паттернов. В своей основе Игра Жизнь представляет собой математическую интересность, которая учит нас многому о процессах жизни, росте и гибели.

Игра написана ChatGPT v4 на JavaScript
Игра написана ChatGPT v4 на JavaScript

https://game-of-life.xorit.ru/ исходный код приведем в конце статьи

Основные правила

Игра Жизнь разворачивается на двумерной сетке, где каждая ячейка представляет собой клетку, которая может быть живой или мертвой. Игра проходит в несколько итераций, называемых поколениями, и эволюция системы определяется четырьмя основными правилами:

  1. Живая клетка с двумя или тремя живыми соседями остается живой в следующем поколении.
  2. Живая клетка с менее чем двумя живыми соседями умирает от одиночества.
  3. Живая клетка с более чем тремя живыми соседями умирает от перенаселения.
  4. Мертвая клетка с ровно тремя живыми соседями оживает в следующем поколении.

Таким образом, вся сетка обновляется одновременно на основе этих правил, и игра продолжается до тех пор, пока не достигнет стабильного состояния или зациклится.

Разнообразие форм и структур

Одним из самых удивительных аспектов Игры Жизнь является множество различных форм и структур, которые могут возникнуть в процессе ее развития. Существует несколько знаменитых паттернов, таких как "планер" (перемещающаяся структура), "колесо" (циклическая структура) и "крепость" (стабильная структура). Эти структуры помогают нам лучше понять разнообразие, которое возникает в результате простых правил и их взаимодействия.

Самоорганизация и эмерджентность

Игра Жизнь является прекрасным примером самоорганизующейся системы, где простые компоненты взаимодействуют друг с другом, порождая более сложные структуры и явления. Феномен эмерджентности, или возникновение новых свойств на более высоких уровнях организации, является одним из ключевых моментов, которые делают эту "игру" такой увлекательной для исследователей.

Применение в науке и технологии

За свою историю Игра Жизнь стала основой для множества научных исследований и технологических разработок. Она была использована для моделирования процессов, таких как рост кристаллов, распространение инфекций и даже образование галактик. В области информатики и технологий Игра Жизнь послужила основой для создания искусственного интеллекта, самореплицирующихся систем и автономных роботов.

Образовательная ценность

Игра Жизнь является отличным инструментом для обучения и развития творческого мышления, так как она позволяет студентам исследовать разнообразие паттернов и структур, возникающих из простых правил. Она также помогает развить интуицию и навыки решения проблем, связанных с комплексными системами и эмерджентностью.

Заключение

Игра Жизнь – это уникальное явление, которое олицетворяет красоту и глубину простых математических правил, способных породить сложные и многогранные явления. Она продолжает вдохновлять ученых, исследователей и энтузиастов по всему миру и остается важным инструментом для изучения самоорганизующихся систем и эмерджентных свойств. Открывайте для себя мир Игры Жизнь и удивляйтесь бесконечным возможностям, которые она предлагает.

Исходные коды

Исходный код HTML-файла

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Игра Жизнь</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<img src="xorit-logo300-r.png" alt="Логотип" width="300">
<h1>Игра Жизнь</h1>
<p>
Правила игры:
<ol>
<li>Любая живая клетка с двумя или тремя живыми соседями выживает на следующее поколение.</li>
<li>Любая мертвая клетка с ровно тремя живыми соседями оживает на следующее поколение.</li>
<li>Все остальные живые клетки умирают в следующем поколении, а мертвые остаются мертвыми.</li>
</ol>
</p>
<div id="game-board"></div>
<p>
Время: <span id="generation">0</span>
</p>
<p>
Население: <span id="population">0</span>
</p>
<button id="seed">Заселить</button>
<button id="start">Старт</button>
<button id="stop">Стоп</button>
<p>
<a href="https://xorit.ru/" target="_blank">Сайт КСОР АйТи</a>
</p>
<script src="script.js"></script>
</body>
</html>

Исходный код файла каскадных стилей style.css

body {
font-family: Arial, sans-serif;
text-align: center;
}

#game-board {
display: inline-grid;
grid-template-columns: repeat(50, 10px);
grid-template-rows: repeat(50, 10px);
gap: 1px;
}

.cell {
width: 10px;
height: 10px;
border: 1px solid #ccc;
box-sizing: border-box;
}

.cell.alive {
background-color: #333;
}

Исходный код скрипта на JavaScript script.js

const gameBoard = document.getElementById('game-board');
const startButton = document.getElementById('start');
const stopButton = document.getElementById('stop');
const seedButton = document.getElementById('seed');
const rows = 50;
const cols = 50;
let interval;
let generation = 0;
let population = 0;

function createGrid() {
for (let i = 0; i < rows * cols; i++) {
const cell = document.createElement('div');
cell.className = 'cell';
cell.addEventListener('click', () => cell.classList.toggle('alive'));
gameBoard.appendChild(cell);
}
}

function getNeighbors(x, y) {
const neighbors = [];

for (let i = -1; i <= 1; i++) {
for (let j = -1; j <= 1; j++) {
if (i === 0 && j === 0) continue;
const newX = x + i;
const newY = y + j;
if (newX >= 0 && newX < cols && newY >= 0 && newY < rows) {
neighbors.push(gameBoard.children[newY * cols + newX]);
}
}
}

return neighbors;
}

function updateGeneration() {
generation++;
document.getElementById('generation').innerText = generation;
}

function updatePopulation() {
population = Array.from(gameBoard.children).filter((cell) => cell.classList.contains('alive')).length;
document.getElementById('population').innerText = population;
}

function step() {
const newGrid = Array.from(gameBoard.children).map((cell, i) => {
const x = i % cols;
const y = Math.floor(i / cols);
const aliveNeighbors = getNeighbors(x, y).filter((cell) => cell.classList.contains('alive')).length;
const alive = cell.classList.contains('alive');

if (alive && (aliveNeighbors === 2 || aliveNeighbors === 3)) {
return true;
} else if (!alive && aliveNeighbors === 3) {
return true;
} else {
return false;
}
});

gameBoard.childNodes.forEach((cell, i) => {
if (newGrid[i]) {
cell.classList.add('alive');
} else {
cell.classList.remove('alive');
}
});

updateGeneration();
updatePopulation();
}

function randomSeed() {
gameBoard.childNodes.forEach((cell) => {
if (Math.random() < 0.2) {
cell.classList.add('alive');
} else {
cell.classList.remove('alive');
}
});

updatePopulation();
}

seedButton.addEventListener('click', () => {
if (!interval) {
randomSeed();
}
});

startButton.addEventListener('click', () => {
if (!interval) {
interval = setInterval(step, 100);
startButton.disabled = true;
stopButton.disabled = false;
}
});

stopButton.addEventListener('click', () => {
if (interval) {
clearInterval(interval);
interval = null;
startButton.disabled = false;
stopButton.disabled = true;
}
});

createGrid();