Какова хорошая стратегия для построения ориентированного графа для игровой карты (в Python)? - PullRequest
9 голосов
/ 04 марта 2009

Я разрабатываю процедурно-сгенерированный игровой мир на Python. Структура мира будет похожа на парадигму MUD / MUSH комнат и выходов, организованных в виде ориентированного графа (комнаты - это узлы, выходы - это ребра). (Обратите внимание, что это , а не , обязательно ациклический граф, хотя я готов рассмотреть ациклические решения.)

По алгоритму генерации мира комнаты разных сортов будут различаться по атрибуту «теги» каждой комнаты (набор строк). После того, как они были созданы, комнаты могут быть запрошены и выбраны по тегам (одиночный тег, пересечение тегов, объединение тегов, лучший кандидат).

Я буду создавать комнаты определенного типа, используя прославленную систему шаблонных объектов и фабричных методов - я не думаю, что детали здесь важны, поскольку текущая реализация, вероятно, изменится в соответствии с выбранной стратегией. (Например, можно было бы добавить теги и запросы тегов в систему шаблонов комнат.)

Например, у меня будут комнаты такого рода:

<code>side_street</code>, <code>main_street</code>, plaza, bar, hotel, restaurant, shop, office

Наконец, вопрос: какова хорошая стратегия для создания и размещения этих комнат для создания графика, который мог бы соответствовать заданным правилам?

Некоторые правила могут включать: одну площадь на 10 000 человек населения; main_street подключается к plaza; side_street подключается к main_street или side_street; hotel поддерживает main_street или plaza соединений и соответственно получает дополнительные теги; и т.д.

Бонусные баллы, если предложенная стратегия позволит реализовать реализацию на основе данных.

Ответы [ 2 ]

7 голосов
/ 04 марта 2009

Во-первых, вам нужно некоторое чувство местоположения. Ваши различные объекты занимают некоторое количество координатного пространства.

Вы должны решить, насколько регулярны эти разные вещи. В простейшем случае вы можете поместить их в свое координатное пространство в виде простых прямоугольников (или прямоугольных тел), чтобы упростить планирование мест.

Если вещи нерегулярны - и плотно упакованы - жизнь несколько сложнее.

Определить карту, чтобы содержать местоположения. Каждое местоположение имеет диапазон координат; если вы работаете с простыми прямоугольниками, то у каждого местоположения может быть (левый, верхний, правый, нижний) кортеж.

Ваша Карта будет нуждаться в методах, чтобы определить, кто находится в данном пространстве, что находится рядом с ним и т. Д.

Затем вы можете выполнить это модульное тестирование с фиксированным набором отработанных вами местоположений, которые все можно сбросить на карту и пройти некоторые базовые проверки работоспособности на отсутствие конфликтов, смежности и т. П.


Во-вторых, вам нужен своего рода "генератор лабиринта". Односвязный лабиринт легко генерируется как древовидная структура, сложенная в заданное пространство.

Лабиринт / дерево имеет «корневой» узел, который будет центром лабиринта. Не обязательно физический центр вашего пространства, но корневой узел будет серединой структуры лабиринта.

В идеале, одна ветвь этого узла содержит один «вход» во все пространство.

Другая ветвь этого узла содержит один «выход» из всего пространства.

Кто-то может бродить от входа к выходу, посещая множество «тупиковых» мест по пути.

Выберите место для корневого узла. Поместите его в свое место на карте.

Это будет иметь 1 - n входов, каждый из которых является поддеревом с корневым узлом и 1 - n входов. Именно этот бизнес с несколькими входами делает дерево естественным образом подходящим для этой структуры. Также правильное дерево всегда хорошо связано тем, что у вас никогда не бывает изолированных разделов, которые не могут быть достигнуты.

Вы - рекурсивно - расправляетесь с корневым узлом, выбирая местоположения и сбрасывая их в доступное пространство.

Проведите модульный тест, чтобы убедиться, что он достаточно хорошо заполняет пространство.


Остальные ваши требования - точная настройка того, как генератор лабиринта выбирает места.

Самое простое - иметь таблицу весов и случайный выбор. Выберите случайное число, сравните его с весами, чтобы увидеть, какой тип местоположения будет идентифицирован.


Ваше определение пространства может быть 2D или 3D - оба довольно рациональны. Для получения бонусного кредита подумайте, как бы вы реализовали 2D-пространство, выложенное плиткой с шестиугольниками вместо квадратов.

Эта «геометрия» может быть плагином Strategy для различных алгоритмов. Если вы можете заменить квадратное 2D на шестиугольное 2D, вы хорошо поработали над OO Design.

2 голосов
/ 05 марта 2009

Ознакомьтесь с обсуждениями на MUD Connector - на форуме "Advanced Coding and Design" (или аналогичном) (или аналогичном) есть несколько замечательных дискуссий о макете и генерации мира и различных типах систем координат / навигации. .

...