Всем доброго дня или ночи! Затронутая в статье, тема может показаться настолько избитой до популярности, что при ее прочтении возникнет стойкое желание взять помидор или, не дай бог, кирпич и кинуть в автора. А изложенные мысли будут напоминать повторное изобретение велосипеда с квадратными колесами. Но идея, побудившая приступить к описанию, буквально зудит и просится ей поделиться, несмотря на угрозу физического или морального наказания.

Историческая справка

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

	Конвей и игра «Жизнь», 1974 год
Конвей и игра «Жизнь», 1974 год

Алгоритм игры настолько прост и в то же время увлекателен, что более полувека привлекает внимание не только учёных, но и простых обывателей:

  • Место действия этой игры — «вселенная» — это размеченная на клетки поверхность или плоскость — безграничная, ограниченная, или замкнутая (в пределе — бесконечная плоскость).

  • Каждая клетка на этой поверхности может находиться в двух состояниях: быть «живой» (заполненной) или быть «мёртвой» (пустой). Клетка имеет восемь соседей, окружающих её.

  • Распределение живых клеток в начале игры называется первым поколением. Каждое следующее поколение рассчитывается на основе предыдущего по таким правилам:

    • в пустой (мёртвой) клетке, рядом с которой ровно три живые клетки, зарождается жизнь;

    • если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае, если соседей меньше двух или больше трёх, клетка умирает («от одиночества» или «от перенаселённости»)

  • Игра прекращается, если

    • на поле не останется ни одной «живой» клетки

    • конфигурация на очередном шаге в точности (без сдвигов и поворотов) повторит себя же на одном из более ранних шагов (складывается периодическая конфигурация)

    • при очередном шаге ни одна из клеток не меняет своего состояния (складывается стабильная конфигурация; предыдущее правило, вырожденное до одного шага назад)

Эти простые правила приводят к огромному разнообразию форм, которые могут возникнуть в игре. К настоящему времени более-менее сложилась следующая классификация фигур:

  • Устойчивые фигуры: фигуры, которые остаются неизменными

  • Долгожители: фигуры, которые долго меняются, прежде чем стабилизироваться[2];

  • Периодические фигуры: фигуры, у которых состояние повторяется через некоторое число поколений, большее 1;

  • Двигающиеся фигуры: фигуры, у которых состояние повторяется, но с некоторым смещением;

  • Ружья: фигуры с повторяющимися состояниями, дополнительно создающие движущиеся фигуры;

  • Паровозы: двигающиеся фигуры с повторяющимися состояниями, которые оставляют за собой другие фигуры в качестве следов;

  • Пожиратели: устойчивые фигуры, которые могут пережить столкновения с некоторыми двигающимися фигурами, уничтожив их;

  • Отражателиустойчивые или периодические фигуры, способные при столкновении с ними движущихся фигур поменять их направление;

  • Размножители: конфигурации, количество живых клеток в которых растёт как квадрат количества шагов;

  • Фигуры, которые при столкновении с некоторыми фигурами дублируются.

Конвей первоначально предположил, что никакая начальная комбинация не может привести к неограниченному размножению и предложил премию в 50 долларов тому, кто докажет или опровергнет эту гипотезу. Приз был получен группой из Массачусетского технологического института, придумавшей неподвижную повторяющуюся фигуру, которая периодически создавала движущиеся «планеры». Таким образом, количество живых клеток могло расти неограниченно. Затем были найдены движущиеся фигуры, оставляющие за собой «мусор» из других фигур.

Планерное ружьё Госпера — первая бесконечно растущая фигура
Планерное ружьё Госпера — первая бесконечно растущая фигура

Что дальше?

Благодаря развитию компьютерных технологий, на сегодняшний день существует столько реализаций игры "Жизнь" как в классическом варианте, так и в виде ее многочисленных модификаций, что тема кажется исчерпанной. Каждый, кто в достаточной мере проявлял интерес к математике или информатике, знаком с данной игрой или даже ей увлекался.

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

Не мудрствуя лукаво по быстрому "на коленке" была накидана страничка, которая тут же была обнародована членам семьи. К мой неожиданности, дети "залипли" на ней на продолжительное время, а мне оставалось только сидеть рядом и пить чай с печеньками.

Демонстрация первой версии
Демонстрация первой версии

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

Палитра фигур и управление процессом эволюции
Палитра фигур и управление процессом эволюции

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

Мир треугольников
Мир треугольников

Итоги

Таким образом случайная идея неожиданно обрела форму и превратилось в более или менее серьезный мини-проект, насчитывающий около полутора тысячи строк кода обычного JS без привлечения тяжелой артиллерии в виде различного рода фреймворков и библиотек. Код постарался "причесать" насколько возможно, но проект еще далек от завершения и в голове полно идей для дальнейшей модернизации.

Проект доступен на GitHub для конструктивной критики и свободного использования.

Всем добра! Спасибо за внимание!