Game of Life
Клеточные автоматы меня увлекали, кажется, всегда. С юности, когда я впервые увидел Игру Жизнь (Game of Life). Я всё время возвращаюсь к теме клеточных автоматов. Даже иконка для сайта – один из самых известных паттернов Игры, который называется глайдер или планер.
Сама Игра Жизнь не подразумевает сложностей в имплементации. Достаточно иметь некое игровое поле (подойдёт двумерный массив) и набор правил для расчёта следующего состояния этого поля. Игра дискретная, т.е. пошаговая.
Самые базовые правила для двумерного клеточного автомата в Game of Life – исходная версия от Джона Конвея, а именно:
- Игра разворачивается на двумерной плоскости с клетками, как на бесцветной шахматной доске. Иными словами, у каждой клетки есть восемь соседей.
- Каждая клетка имеет бинарное состояние. Она либо жива, либо мертва.
- Состояние клетки на следующем шаге Игры определяется тем, жива ли клетка сейчас и сколько из её соседей живо, а точнее:
- Мёртвая клетка оживёт, если у неё сейчас ровно три живых соседа.
- Живая клетка будет жить дальше, если сейчас два или три живых соседа.
- В иных случаях клетка будет мёртвой на следующем шаге.
Наивная имплементация будет работать методом перебора всего поля. Это достаточно ёмкая вычислительная задача и существует ряд оптимизаций. Если не ошибаюсь, даже в Красной Книге OpenGL есть ряд упоминаний об оптимизации проверок на границах поля. Есть множество оптимизаций для Game of Life, про них есть целые работы.
Мне же всегда интересно посмотреть на то, как ведут себя разные среды и языки с подобной нагрузкой. Что будет с JIT-компиляторами? А C позволит что-то сделать быстрее? И множество других. Естественно, это не научный интерес, а лишь хобби и сравнивать ЯП только таким путём не стоит.
С 2010-х годов я имплементировал клеточные автоматы в том или ином виде. Просматривая архивы, нашёл веб-версию от 2017 года. На ней я учился работать с профилированием JavaScript и Canvas в браузерах Firefox и Chrome.
Были и версии под C++, Java и даже чистый C, ведь ничего особенного там не требуется. Но, пока решил выложить именно JavaScript версию. Она наиболее простая в исполнении и пользовании. Это веб-страничка со скриптом и стилями.
Версия не отличается особой оптимизацией, но и сильно обновлять её не нужно. Посмотреть на то, как будет развиваться случайно сгенерированное поле можно.
Конечно, хочется ещё добавить настройки рэндом-генератора, шага расчёта, масштабирование поля и добавить выбор других, не менее интересныx, чем исходная Жизнь, правил.
Проекту “Glider” выделил репозиторий на GitHub и развернул на GitHub Pages.
Журнал изменений
1 января 2026 г.: перенёс исходники на GitHub.