Программа «Жизнь», созданная британским математиком Джоном Конвеем в 1970-х годах, представляет собой игру без участия игроков, где участник определяет исходное положение клеток, а затем следит за дальнейшим ходом процесса.
Игровое пространство — это двумерная поверхность, разбитая на ячейки, каждая из которых окружена восемью соседними ячейками и способна пребывать либо в активном («живом») состоянии, либо в неактивном («мертвом»). Развитие системы продолжается автоматически согласно заданным правилам, пока на игровом поле остаются активные элементы.
Вдохновение для разработки автомата пришло из желания создать универсальную математическую модель, способную моделировать разнообразные процессы — от эволюции звёздных скоплений до динамики общественных сообществ. Игра оказала значительное влияние на научные исследования в разных сферах, включая биологию и физику.
Пример работы программы:
Игровое пространство — это двумерная поверхность, разбитая на ячейки, каждая из которых окружена восемью соседними ячейками и способна пребывать либо в активном («живом») состоянии, либо в неактивном («мертвом»). Развитие системы продолжается автоматически согласно заданным правилам, пока на игровом поле остаются активные элементы.
Вдохновение для разработки автомата пришло из желания создать универсальную математическую модель, способную моделировать разнообразные процессы — от эволюции звёздных скоплений до динамики общественных сообществ. Игра оказала значительное влияние на научные исследования в разных сферах, включая биологию и физику.
Код: Выделить всё
#!/usr/bin/yabasic
// Игра "Жизнь" Джона Конвея на Yabasic
// Авторы: John Horton Conway, адаптировано под Yabasic: Anton Shekhetov
open window 500, 500
// Создаем двумерный массив для представления состояния каждой клетки. Размерность массива зададим равной 50×50 клеток.
dim grid(50, 50) // Размерность массива зададим равной 50×50 клеток.
// Заполняем массив случайными значениями
for x = 1 to 50
for y = 1 to 50
grid(x, y) = int(ran(2)) // Получение строгих значений 0 или 1
next y
next x
// Процедура для подсчета количества живых соседей
sub count_neighbors(x, y)
neighbors = 0 // Переменная для хранения количества живых соседей
for dx = -1 to 1 // По горизонтальной оси
for dy = -1 to 1 // По вертикальной оси
if dx = 0 AND dy = 0 THEN // Пропускаем центральную клетку
CONTINUE
ENDIF
// Рассчитываем координаты соседней клетки
nx = x + dx
ny = y + dy
// Проверяем границы карты
IF nx < 1 OR nx > 50 OR ny < 1 OR ny > 50 THEN
CONTINUE
ENDIF
// Проверяем, является ли соседняя клетка живой
IF grid(nx, ny) = 1 THEN
neighbors = neighbors + 1 // Увеличили счётчик живых соседей
ENDIF
NEXT dy
NEXT dx
RETURN neighbors // Возвращаем итоговое количество живых соседей
END SUB
// Процедура для обновления состояния клеток
sub update_grid()
DIM temp_grid(50, 50) // Временный массив для нового состояния клеток
FOR x = 1 TO 50
FOR y = 1 TO 50
alive_neighbors = count_neighbors(x, y)
IF grid(x, y) = 1 THEN // Живая клетка
IF alive_neighbors < 2 OR alive_neighbors > 3 THEN
temp_grid(x, y) = 0 // Умерла от одиночества или перенаселенности
ELSE
temp_grid(x, y) = 1 // Продолжила жить
ENDIF
ELSE // Мертвая клетка
IF alive_neighbors = 3 THEN
temp_grid(x, y) = 1 // Возникновение новой жизни
ELSE
temp_grid(x, y) = 0 // Осталась мертвой
ENDIF
ENDIF
NEXT y
NEXT x
// Копируем новое состояние обратно в основной массив
FOR x = 1 TO 50
FOR y = 1 TO 50
grid(x, y) = temp_grid(x, y)
NEXT y
NEXT x
END SUB
// Процедура для отображения текущего состояния сетки
sub render()
clear window
backcolor("255,255,255")
for x = 1 to 50
for y = 1 to 50
if grid(x, y) = 1 then
cb = 255-alive_neighbors*20
color("0,255,0")
fill rectangle (x-1)*10, (y-1)*10, x*10, y*10
endif
next y
next x
end sub
// Основной цикл игры
WHILE TRUE
update_grid() // Обновляем состояние клеток
render() // Перерисовываем сетку
PAUSE(0.1) // Пауза для плавности анимации
WEND