Документация Engee
Notebook

Игра «Жизнь»

Открыть пример в Engee

Это клеточный автомат, игра без игроков, в которой пользователь создаёт начальное состояние, а потом лишь наблюдает за её развитием. В игре можно создать процессы с полнотой по Тьюрингу, что позволяет реализовать любую машину Тьюринга.

Правила

  1. В пустой клетке, с которой соседствуют три живые клетки, зарождается жизнь.
  2. Eсли у живой клетки есть две или три живые соседки, то эта клетка продолжает жить
  3. Если живых соседей меньше двух или больше трёх клетка умирает.

Реализованный алгоритм

Установка и подключение библиотек.

В случае необходимости установки библиотек присвойте параметру install значение единицы.

In [ ]:
install = 1;

if install == 1
   using Pkg
   Pkg.add("Animations")
end
   Resolving package versions...
  No Changes to `~/.julia/environments/v1.9/Project.toml`
  No Changes to `~/.julia/environments/v1.9/Manifest.toml`

Подключение библиотек.

In [ ]:
using Plots
using FileIO
using Images
using Animations

Инициализация параметров алгоритма.

In [ ]:
# Размеры мира
x = 350; 
y = 350;

# Создание мира
World = falses(x, y);
World[3:end-2, 3:end-2] .= true;

# Инициализация вспомогательных параметров
runGame = true; # Условие запуска/остановки цикла обработки мира
count_steps = 0; # Счётчик кол-во шагов в цикле
num_step = 1000; # Кол-во шагов цикла

Цикл обработки и визуализации мира.

In [ ]:
@gif while runGame
    global World, runGame, x, y, count_steps, num_step; # Объявление переменных как глобальные.
    # Отрисовка мира.
    heatmap(World, size=(x,y), aspect_ratio=:equal, cbar=:none, axis=nothing, border=:none, c = :blues)
    # Инициализация нового состояния мира.
    WorldNew = falses(x, y);
    # Обработка каждой клетки в мире.
    for i in 2:x-1
        for j in 2:y-1
            p = World[i, j]
            
            Near = World[(i-1):(i+1), (j-1):(j+1)] # Выделение окружения клетки.
            Near[2, 2] = false # Выкалывание обрабатываемой клетки.
            NearSum = sum(Near) # Расчёт кол-ва клеток в окружении.
            # Обработка дальнейшего развития клетки, опираясь на правила описанные выше.
            if p
                if (NearSum == 2) || (NearSum == 3)
                    p = true
                else
                    p = false
                end
            else
                if NearSum == 3
                    p = true
                end
            end
            # Сохранение обработанной клетки в новое состояние Мира.
            WorldNew[i, j] = p
        end
    end
    # Проверка условия выхода из цикла обработки.
    if count_steps > num_step
        runGame = false
    end
    # Счётчик шагов
    count_steps += 1
    # Сохранение нового состояния мира для следующей итерации цикла.
    World = WorldNew
end
[ Info: Saved animation to /user/tmp.gif
Out[0]: