Можно ли получить улей-подобную структуру, соединяющую все комнаты без слишком большого количества коридоров? (Слишком много из 3-4 комнат, идущих из одной комнаты)
Ниже приведен вывод о том, как выглядят мои комнаты, в основном они расположены случайно.
Что я надеюсь получить в коридоре.
procedural-generation
Blenderer
источник
источник
Ответы:
Ну, самый простой способ, который я могу придумать, начинается с того, что все комнаты соединены хотя бы одним коридором:
Теперь мы знаем, что вы можете добраться до всех комнат, но теперь, если вы хотите больше, чем этот строго линейный лабиринт, вы можете просто пройти через ваши комнаты и случайным образом найти новый путь, соединяющий комнаты, до ограничения на комнату 2-3, или пока определенный процент номеров не достигнет максимального количества соединений - и т. д.
В качестве последнего шага вы можете добавить правила, которые бы изменили ваши результаты для соответствия различным ситуациям. Например, вы можете заметить, что любая комната с одним коридором по определению является тупиком; Вы можете сделать больше тупиков, или вы можете устранить их все, убедившись, что у всего есть как минимум 2 соединения. Вы можете сделать тупики иметь секретный проход. Вы могли бы убедиться, что комната босса - тупик. Вы можете убедиться, что ваша начальная комната тупиковая, но затем убедитесь, что вторая комната имеет минимум X соединений. До бесконечности.
Каждое предположение и правило могут радикально изменить внешний вид ваших уровней, но это часть веселья! Это должно, по крайней мере, дать вам комнаты, похожие на улья / пещеры.
источник
Просто постройте свои комнаты уже подключенными. Начните с одной комнаты, затем построите 1-3 коридора в другие комнаты. Затем повторяйте, пока не добавите достаточно комнат.
источник
Поскольку эти комнаты представляют собой вершины графа, встроенные в 2-мерную плоскость, теоретически это можно сделать, решив задачу коммивояжера (что было бы хорошо только с несколькими комнатами). Очевидно, что простая эвристика будет в порядке и обеспечит разумную масштабируемость.
Вы вычисляете края (длины коридора) между всеми комнатами. Вы сортируете их по длине. Вы добавляете кратчайший коридор, если только он не создает цикл или не увеличивает степень вершины (комнаты) над желаемым максимальным значением (3-4) (повтор). Чтобы проверить циклы, вы можете применить UnionFind или сделать быстрый BFS на небольших данных.
источник