Игра «Жизнь»¶
Это клеточный автомат, игра без игроков, в которой пользователь создаёт начальное состояние, а потом лишь наблюдает за её развитием. В игре можно создать процессы с полнотой по Тьюрингу, что позволяет реализовать любую машину Тьюринга.
Правила
- В пустой клетке, с которой соседствуют три живые клетки, зарождается жизнь.
- Eсли у живой клетки есть две или три живые соседки, то эта клетка продолжает жить
- Если живых соседей меньше двух или больше трёх клетка умирает.
Реализованный алгоритм¶
Установка и подключение библиотек.
В случае необходимости установки библиотек присвойте параметру install значение единицы.
In [ ]:
install = 1;
if install == 1
using Pkg
Pkg.add("Animations")
end
Подключение библиотек.
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
Out[0]: