Я пытаюсь написать свою Игру Жизни, со своим собственным набором правил. Первой "концепцией", которую я хотел бы применить, является социализация (что в основном означает, что клетка хочет быть одна или в группе с другими ячейками). Структура данных - это двумерный массив (на данный момент).
Чтобы иметь возможность перемещать ячейку в/из группы других ячеек, мне нужно определить, куда ее перемещать. Идея состоит в том, что я оцениваю все ячейки в области (соседей) и получаю вектор, который говорит мне, куда перемещать ячейку. Размер вектора равен 0 или 1 (не двигайтесь и не двигайтесь), а угол представляет собой массив направлений (вверх, вниз, вправо, влево).
Это изображение с изображением сил для клетки, как я себе это представлял (но охват может быть больше 5):
Позвольте, например, сделать эту фотографию:
Forces from lower left neighbour: down (0), up (2), right (2), left (0)
Forces from right neighbour : down (0), up (0), right (0), left (2)
sum : down (0), up (2), right (0), left (0)
Так что клетка должна идти вверх.
Я мог бы написать алгоритм с большим количеством операторов if и проверить все ячейки по соседству. Конечно, этот алгоритм был бы самым простым, если бы параметр 'reach' был установлен в 1 (первый столбец на рисунке 1). Но что, если я изменю параметр досягаемости на 10, например? Мне нужно было бы заранее написать алгоритм для каждого параметра "достижения"... Как я могу избежать этого (обратите внимание, что сила возрастает (1, 2, 4, 8, 16, 32,...))? Могу ли я использовать конкретный шаблон дизайна для этой проблемы?
Кроме того: самое главное не скорость, а возможность расширить исходную логику.
Что следует принять во внимание:
- досягаемость должна быть передана как параметр
- Я хотел бы изменить функцию, которая рассчитывает силу (потенциал, Фибоначчи)
- ячейка может перейти в новое место, только если это новое место не заселено
- следите за углами (например, вы не можете оценить правых и верхних соседей в верхнем правом углу)