Ва-Тор похож на клеточные автоматы. В каком порядке должны обновляться ячейки?
Некоторое время назад я написал Wa-Tor, похожий на клеточные автоматы ( см. Википедию), но с еще несколькими видами и немного более умными видами. За исключением большого количества тонкой настройки, чтобы получить стабильную систему, это было довольно просто и работало хорошо. Однако с того времени я спрашиваю себя (а теперь и вас), как обновлять ячейки "реалистично".
Мой "мир" был сеткой и всегда обновлялся с левого верхнего до правого нижнего. ИМО это также означает, что ячейки, которые находятся ближе к верху и слева, всегда быстрее. Так, например, рыба в клетке [3, 3] может быть съедена акулой в [3, 2] перед обновлением. Если бы клетки имели противоположные позиции, рыба всегда убегала бы от акулы, так как она может отойти от акулы, прежде чем ее обновят.
Я прав, что это "проблема" (или, по крайней мере, нереально)?
ИМО в реалистичной обстановке все ячейки должны обновляться одновременно, но я не знаю, как реализовать что-то подобное. Другой метод, который я могу себе представить, - это оценить клетки в "перемешанном" порядке.
Как бы вы решили эту проблему / как обычно решаются такие проблемы?
2 ответа
Как отмечает @Rogach, одновременные обновления не будут работать. Поскольку ваши клеточные автоматы недетерминированы, две рыбы не будут знать следующую позицию друг друга и могут столкнуться.
Я думаю, что лучшее решение, учитывая, что ваши клеточные автоматы недетерминированы, состоит в том, чтобы обновить вашу сетку недетерминированным способом, т.е. случайным образом. Выберите случайные ячейки для обновления. Либо выбирайте ячейки случайным образом и отслеживайте, какие из них вы обновили, чтобы каждая ячейка обновлялась ровно один раз за такт, либо выбирайте ячейки случайным образом и не следите за их отслеживанием. Второй подход будет проще, но рискует обновлять некоторые ячейки чуть чаще. В среднем все ячейки обновлялись бы одинаково, если бы у вас была равномерно распределенная случайная функция.
ИМО в реалистичной обстановке все ячейки должны обновляться одновременно, но я не знаю, как реализовать что-то подобное.
Это подход, который я бы предложил. Есть две сетки: "старая" и "новая / текущая". При расчете следующего поколения основывайте свои расчеты на старой сетке и записывайте результаты в новую сетку. Затем отобразите новую сетку. Теперь поменяйте местами указатели так, чтобы новая сетка стала "старой", а старая стала новой сеткой. Повторение.