Я пытаюсь написать свою Игру жизни , со своим собственным набором правил. Первой «концепцией», которую я хотел бы применить, является социализация (что в основном означает, что клетка хочет быть одна или в группе с другими ячейками). Структура данных - это двумерный массив (на данный момент).
Чтобы иметь возможность перемещать ячейку в / из группы других ячеек, мне нужно определить, куда ее перемещать. Идея состоит в том, что я оцениваю все ячейки в области (соседей) и получаю вектор, который говорит мне, куда перемещать ячейку. Размер вектора равен 0 или 1 (не двигайтесь и не двигайтесь), а угол представляет собой массив направлений (вверх, вниз, вправо, влево).
Это изображение с изображением сил для клетки, как я себе это представлял (но охват может быть больше 5):
ForceAppliedToACell http://img293.imageshack.us/img293/2852/29186643.png
Давайте, например, возьмем эту картинку:
Пример http://img683.imageshack.us/img683/7357/70002678.png
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, ...)) ? Могу ли я использовать конкретный шаблон дизайна для этой проблемы?
Кроме того: самое главное не скорость, а возможность расширить исходную логику.
Что нужно учитывать:
- значение должно быть передано в качестве параметра
- Я хотел бы изменить функцию, которая вычисляет силу (потенциал, Фибоначчи)
- ячейка может перейти в новое место, только если это новое место не заселено
- следить за углами (например, вы не можете оценить правых и верхних соседей в верхнем правом углу)