Какой алгоритм генерации лабиринта в игре Netwalk?

Каков алгоритм создания лабиринта в игре Netwalk?

Скриншот игры по сети


person Community    schedule 07.07.2011    source источник
comment
Я повторно открыл это в свете качества опубликованного ответа. Однако сообщество вправе не согласиться с моим решением. Я полагаю, что ответ доказывает, что на этот вопрос действительно можно ответить объективно, конструктивно, хотя я согласен, что формулировка довольно широкая.   -  person Tim Post♦    schedule 08.07.2011


Ответы (1)


исходный код доступен в Google Code, так что вы можете сами прочитать его и узнать! Лабиринт создается функцией generate_maze в game.c, строки 78 и далее.


Обновление: попробуйте демоверсию!

Netwalk создает лабиринт, запуская рандомизированную версию алгоритма Прима для поиска минимальное связующее дерево. Алгоритм Прима итеративно выращивает дерево по одной ветке за раз, начиная с исходного узла (или узлов: в данном случае «сервера», темно-синего прямоугольника двойной высоты). В любой момент выполнения алгоритма структура данных выглядит примерно так:

введите здесь описание изображения

Клетки, окрашенные в зеленый цвет, — это клетки на концах растущих ветвей: у них все еще есть по крайней мере один пустой сосед, в который они могли бы врасти. На каждом шаге алгоритм выбирает одну из этих зеленых ячеек, а затем выбирает одного из его пустых соседей(1) и добавляет ветвь к этому соседу. Эта новая ветвь блокирует рост соседних ветвей в ее направлении. Когда у ветки больше нет пустых соседей(2), она удаляется из списка зеленых ячеек.

В итоге зеленый список оказывается пустым: ни у одной из ветвей сети нет пустых соседей. Это означает, что доска заполнена, и каждая ячейка подключена к серверу одним путем.

введите здесь описание изображения

[Я идеализировал детали в нескольких местах: (1) на самом деле алгоритм Netwalk немного наивен и просто выбирает случайное направление, и если сосед в этом направлении непуст, он ничего не делает и продолжает к следующей итерации. (2) Ветви без пустых соседей своевременно не обнаруживаются: они удаляются из зеленого списка только в том случае, если они случайно выбраны. Демонстрация исправляет эти незначительные недостатки.]

person Gareth Rees    schedule 07.07.2011
comment
Большое спасибо за то, что указали на идею игры и демоверсии. Это классно. - person ; 08.07.2011
comment
Это отличный, объективный ответ на действительно широкий вопрос. Благодарим вас за участие. - person Tim Post♦; 08.07.2011