Этот текст описывает реализацию игры «Жизнь» в Unity с использованием C#, без применения оператора if.
Постановка задачи и ограничения
Задача состояла в написании игры «Жизнь» в Unity, исключив из кода все условные операторы. Запрещенные конструкции:
- if
- switch
- Тернарный оператор
- Хаки с циклами
- Условные функции
Разрешено использование цикла for. Допускается использование внешних библиотек и функций, которые могут содержать условные операторы внутри себя.
Принцип работы игры «Жизнь»
Игровое пространство — сетка клеток. Каждая клетка может быть «живой» или «мертвой». Состояние клеток меняется на каждом шаге по следующим правилам:
- Рождение: Мертвая клетка оживает, если у нее ровно три живых соседа.
- Выживание: Живая клетка продолжает жить, если у нее два или три живых соседа.
- Смерть: Живая клетка умирает, если у нее меньше двух или больше трех живых соседей.
Подсчет соседей ведется по всем восьми направлениям (включая диагонали).
Реализация в Unity без if
Сцена Unity содержит картографическую камеру с черным фоном, тайлы (зеленые квадратики) для визуализации клеток и компонент Life для симуляции.
Структура кода
Используется тип Cell, представляющий клетку, и виртуальное поле — массив клеток. Для каждой клетки хранится количество «родителей» (живых соседей на предыдущем шаге). Обновление состояния происходит в два этапа:
- Подсчет родителей: Цикл перебирает все клетки, и каждая клетка «влияет» на количество родителей у своих соседей. Мертвая клетка добавляет 0 родителей, живая – определенное количество.
- Трансформация клеток: Повторный цикл перебирает клетки. На основе количества родителей (ключ) и таблицы переходов (массив transitions) определяется новое состояние клетки.
Таблица переходов хранит соответствие между количеством родителей и новым состоянием клетки (живая/мертвая). Это позволяет заменить условные операторы на индексированный доступ к массиву.
Функция симуляции
Функция обновления вызывается каждые 0.3 секунды. Она заполняет виртуальное поле, выполняет два этапа симуляции (подсчет родителей и трансформация клеток), и производит отрисовку, устанавливая тайлы в соответствии с состоянием клеток.
Обработка границ
Обработка выхода за границы массива осуществляется обходной стратегией, позволяющей избежать явного использования if. Это может привести к некорректному поведению клеток на границах, но в данном случае это допустимый компромисс.
Таблица переходов и альтернативные подходы
Таблица переходов позволяет реализовать логику игры без использования if. В будущем планируется рассмотреть замену таблицы переходов на математические коэффициенты или виртуальные методы для повышения читаемости кода. Оптимизация производительности не была главной целью, но использование массивов и избежание if повлияло на производительность не так сильно, как ожидалось.
Проект демонстрирует возможность реализации игры «Жизнь» в Unity на C# без использования оператора if, заменив его таблицей переходов. Этот подход не обязательно является наиболее эффективным или читаемым, но он демонстрирует альтернативный способ решения задачи. Дальнейшие эксперименты могут включать замену таблицы переходов на другие структуры данных и оптимизацию производительности.