Процедурне покоління підземелля: Чи існує простий алгоритм, щоб переконатися, що всі ці кімнати підключаються за допомогою мінімальних коридорів?


9

Чи можна отримати структуру, що нагадує вулик, з'єднавши всі кімнати, не маючи занадто багато коридорів? (Занадто багато - 3-4 + коридори, що надходять із однієї кімнати)

Нижче наведено висновок про те, як виглядають мої кімнати, в основному вони розміщені випадковим чином.

вихід сітки кімнат, розміщених випадковим чином

Я сподіваюся отримати коридор.

http://i.imgur.com/9GUi6Yy.png


Я не думаю, що 3 або 4 - "занадто багато коридорів". Особливо, якщо у вашій підземеллі є 9 номерів. Плюс, я не впевнений, що ви маєте на увазі під "вуликоподібною структурою", чи могли б ви детальніше розглянути, на який вигляд ви намагаєтесь піти?
fnord

Можливо, включіть "завершену" карту, щоб показати, що вам цікаво.
MichaelHouse

Ага так, я мав на увазі максимум 3 або 4 коридори, що виходили з кожної кімнати.
Блендерер

Я додав зображення того, над чим працюю, аж до коридорів.
Блендерер

2
Якщо у вас немає 3 коридорів з будь-яких кімнат, ви зможете зробити просте лінійне з'єднання кімнат і просто виберіть одну та приєднаєте її до двох своїх найближчих суміжних сусідів.
Нік

Відповіді:


6

Ну, найпростіший спосіб, який я можу придумати, починається з того, щоб переконатися, що всі кімнати з'єднані хоча б одним коридором:

  1. Почніть з останньої, або першої, кімнати.
  2. Захопіть випадкову кімнату на відстані 1 відстані, яка ще не підключена до якоїсь кімнати (всі кімнати починають відключатися, тому ви будете вести облік цього, як підете).
  3. Якщо такої кімнати немає, перейдіть на відстань +1. Якщо нормально тунель над / під іншою кімнатою, це простіше, якщо припустити, що ви не хочете з'єднувати коридори.
  4. Пропрацюйте свій шлях через псевдовипадкові випадки, поки всі кімнати не з’єднані.

Тепер ми знаємо, що ви можете дістатися до всіх приміщень, але тепер, якщо ви хочете більше, ніж цей суворо лінійний лабіринт, ви можете просто переступити через свої кімнати і навмання зробити новий шлях для підключення кімнат, максимум до 2-3 номерів, або поки певний відсоток номерів не потрапить на максимум з'єднань - тощо.

На завершальному етапі ви можете додати правила, які б змінили ваші результати у відповідних ситуаціях. Наприклад, ви можете помітити, що будь-яке приміщення, що має лише 1 коридор, за визначенням є тупиком; Ви можете зробити більше тупиків, або ви можете усунути їх, переконавшись, що все має принаймні 2 з'єднання. Ви можете зробити так, щоб тупики мали секретний прохід. Ви можете переконатися, що кімната боса - тупик. Ви можете переконатися, що ваша початкова кімната тупикова, але потім переконайтеся, що друга кімната має мінімум X підключень. Ad infinitum.

Кожне припущення та правило можуть докорінно змінити те, як виглядають ваші рівні, але це частина задоволення! Це має принаймні змусити кімнати для вуликів / печер.


Це досить близько до алгоритму мінімального Spanning Tree дерева Крускала - це змінює умову в 2 від "ще не підключено до якоїсь кімнати" до "не підключено до того ж кластеру ", що виправляє помилку в описаних вище правилах, де ви могли мати ситуація, коли кожна кімната підключена до якоїсь кімнати, але підземелля в цілому все ще утворює безліч роз'єднаних островів. Крускал гарантовано знайде графік з'єднання з мінімальною загальною довжиною коридору.
DMGregory

3

Просто будуйте свої кімнати, які вже підключені. Почніть з однієї кімнати, потім побудуйте 1-3 коридори до інших кімнат. Потім повторіть, поки ви не додасте достатньо кімнат.


2

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

Ви обчислюєте краї (довжини коридору) між усіма кімнатами. Ви сортуєте їх за довжиною. Ви додаєте найкоротший коридор, якщо він не створює цикл або не збільшує ступінь вершини (приміщення) вище бажаного максимального значення (3-4) (Повторити). Щоб перевірити наявність циклів, ви можете застосувати UnionFind або зробити швидкий BFS для невеликих даних.


Ця відповідь краще, ніж прийнята відповідь. Жадібна стратегія вибору перших коротких сполучних коридорів спочатку повинна спрацювати. Щоб уникнути циклів, не встановлюйте зв’язок із кімнатами, до яких уже підключений коридор.
Jelle van Campen

@JellevanCampen Дякую ;) У вас можуть бути два ізольовані з'єднані компоненти. Тож ви, мабуть, захочете скористатись об'єктом пошуку або перевірте з BFS, чи два вузли підключені.
AturSams

Ага так, ваше право на це, моя погана.
Jelle van Campen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.