Зменшіть кількість країв графіка, підтримуючи його з’єднаним


10

Я розробляю гру з випадковими породженими підземеллями. Я хотів би розглянути це як пов'язаний, непрямий графік, у якому вузли є приміщеннями, а краї - дверима або коридорами. Тоді я вибираю «бічний» вузол як вхід підземелля, обчислюю відстань між цим входом та всіма іншими вузлами і вирішую, що один із найдальшіх вузлів - «ціль» підземелля (місце знаходження скарбу, начальника, принцеса тощо).

Я бачив 2 способи генерації остаточної топографії підземелля:

  • Створіть спочатку випадковий графік, а потім спробуйте заповнити 2d світ кімнатами у випадкових місцях, дотримуючись крайових з'єднань. Я подумав, що це може бути часом важко, оскільки покоління кімнати може бути «замкнене», намагаючись помістити кімнати в неможливі місця.
  • Створіть перші кімнати, розмістивши їх випадковим чином там, де вони підходять, а потім відобразіть результат на вузли та краї. Я вирішив спробувати це.

Моя ідея полягає у:

  • Спочатку згенеруйте велику кімнату, яка б містила всю підземелля.
  • Поставте стіну всередині великої кімнати у випадковому місці, розділивши велику кімнату на 2 менші кімнати різної площі.
  • Потім я продовжую ділити кожну кімнату на 2, поки вони не надто малі, або загальна кількість номерів не досягне максимального (або будь-якої іншої умови). Кожна нова кімната - це вузол.
  • Закінчивши, я перевіряю кожну кімнату і знаходжу всі сусідні інші приміщення, позначаючи 2 вузли як з'єднані краєм.

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

Моя проблема полягає в тому, що занадто багато дверей і коридорів, що з'єднують кімнати.

Тому я хотів би алгоритм, який зменшує кількість ребер підключеного ненаправленого графіка , але підтримує його підключеним (усі вузли залишаються доступними) в кінці.


Якщо ви хочете знати, ваша ідея - це двійкове дерево пошуку. Я ним користувався; це робить дуже приємні підземелля і легко. :)
Качка комуніста

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

Двійкове дерево пошуку, підключений графік, праворуч. Мені так погано ставиться до звичайної назви речей.
Splo

Відповіді:


13

Використовуйте алгоритм Прима, щоб отримати мінімальну діапазон дерева для вашого графіка (додайте рандомізовані ваги, або додайте більші ваги біля входу, або зробіть алгоритм на ваш вибір) та повторно додайте кілька дверей / країв навмання. Таким чином у вас будуть підключені всі кімнати та кілька зайвих доріжок.


1
О, правильно, мінімально простягається дерево, звичайно! Гарна ідея, дякую.
Splo


0

Деякі генератори підземелля в цьому списку з Inkwell Ideas є відкритим кодом або надають документацію щодо своїх алгоритмів. Google також надасть вам багато, шукаючи "[програмування мовного генератора] підземелля". На жаль, мого улюбленого не можна знайти жодним із цих методів, не дивлячись на те, що я був найбільш добре документально підтвердженим, і я не можу згадати його ім'я, оскільки нещодавно я втратив його після аварії на жорсткому диску. Цю відповідь я оновлю після того, як виконаю відновлення на цьому диску.

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