Я делаю игру с процедурно сгенерированным миром, созданным в начале игры, состоящим из нескольких областей, представленных сетками (скажем, 8x8, 9x6, размеры в идеале были бы произвольными). Эти области должны быть связаны друг с другом через список зависимостей.
Соединение существует, когда по крайней мере 3 пространства этой сетки открыты между этими двумя областями. В средней ячейке этой 3 области пространственного соединения находится дверной проем между областями:
Я пытался найти способ соединить их, но он становится все более сложным, чем больше областей вы должны рассмотреть одновременно.
Я попробовал некоторые бумажные прототипы, и, хотя это очень простой процесс, когда я выполняю это визуально, я не нашел хорошего набора математических выражений, который позволял бы мне размещать комнаты с той же эффективностью с помощью кода.
Вот «простой» пример, с которым я сейчас борюсь:
- Область 'a' должна быть связана с 'b' и 'c'
- Область 'b' должна быть связана с 'a' и 'd'
- Область 'c' должна быть связана с 'a' и 'd'
- Область 'd' должна быть связана с 'b' и 'c'
Для простоты рассмотрим, как мы размещаем комнаты в порядке их появления в списке (я пробовал другие). Поэтому я рассматриваю это как ваш стандартный процедурный алгоритм Dungeon Generation.
Мы ставим «а» в любом месте на доске, так как это первая область. Затем мы выбираем случайную стену и, поскольку с этой стеной ничего не связано, мы можем разместить там «b»:
Теперь нам нужно разместить «c», но «a» уже находится на доске и имеет занятую стену, поэтому мы решили разместить ее на другой стене. Но не все места размещения подойдут, потому что появляется «d», и его тоже нужно соединить с «b» и «c»:
Я пробовал возможное ограничение, что 2 комнаты с одинаковым набором зависимостей не могут находиться на противоположных стенах, но даже это не гарантирует успеха:
А в других случаях, когда области имеют разные размеры, может оказаться, что они находятся на противоположных стенах:
Кроме того, игнорирование используемой стены является ошибочным допущением, поскольку оно исключает допустимые решения:
Я пытался найти исследование других алгоритмов процедурного генерирования или аналогичных им, таких как алгоритмы оптимальной упаковки прямоугольников и компоновки графиков, но обычно эти алгоритмы не учитывают все ограничения этой проблемы и их трудно совместить друг с другом.
Я думал о множестве подходов, включая размещение области и возврата, пока не будет найдено подходящее размещение, но они кажутся очень зависимыми от проб и ошибок и дорогостоящими с точки зрения вычислений. Но, учитывая обширные исследования последних двух проблем, которые я упомянул, это может быть единственным / лучшим решением?
Я просто хотел посмотреть, сталкивался ли кто-то с подобными проблемами в прошлом или хочет помочь мне разобраться в этом и дать несколько советов о том, с чего мне начать с алгоритма. Или, если это не удастся, мне придется ослабить установленные мной ограничения.