Алгоритм генерації 2d лабіринту [закритий]


27

Який алгоритм ви раніше використовували для створення простого 2d лабіринту?

Відповіді:


21

Існує маса різноманітних способів виготовлення лабіринтів. Тут представлений величезний перелік їх та їх описи: http://www.astrolog.org/labyrnth/algrithm.htm

Я думаю, що я використав той, що описаний у "Ідеально".


Дуже приємний ресурс, саме те, що я шукав.
jdeseno

Любіть цей сайт, використовували його багато років тому.
zanlok

8

Я віддаю перевагу щільно накрученим лабіринтам, які створює Алгоритм Крускала.

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

Я буду використовувати такі терміни:

  • Графік
    • сам лабіринт.
  • Вузол
    • розташування в лабіринті. На квадратному лабіринті це квадратна клітина.
  • Край
    • з'єднання між двома вузлами. На квадратному лабіринті це брусок на 1 довжину.
  • Дерево групи
    • набір вузлів, які можуть бути порожніми, розташованими як дерево

І з них ми отримуємо:

  1. Створіть групу GTG для групи Graph Tree , що містить групи дерев
  2. Населяйте GTG однією групою дерев, що містить один вузол, для кожного місця вашого лабіринту
  3. Створіть крайовий набір E
  4. Населяйте E з кожним дійсним краєм у лабіринті
  5. Хоча в GTG є більше однієї групи , і поки E не порожній:
  6. Виберіть випадковий край rE від E
  7. Визначити кінцеві точки p1 і p2 з Г
  8. Видаліть rE з E
  9. Перевірте, до яких груп p1 та p2 належать ( p1g та p2g відповідно).
  10. Якщо p1g і p2g різні, приєднайтеся до групи дерев p1g та p2g на p1 -> p2 та перепишіть усі групові права власності на одне дерево на інше, таким чином приєднавшись до дерев.
  11. Поверніться до кроку 5.
  12. Якщо у вас немає ребер, але більше одного дерева, або графік не підключений, або є помилка.
  13. Якщо у вас є лише одне дерево, у вас є повний лабіринт без циклу.

1
У нас був проект GUI, і нам довелося побудувати випадковий 2D лабіринт на GUI. Саме так я це зробив, і ніколи не зрозумів, що використовую Kruskals lol. Я точно зрозумів, що використав графік.
Брайан Харрінгтон


1

Один простий спосіб - скласти список північних стін і західних стін, а потім переставити їх. Дайте кожній кімнаті номер. Потім підірвіть одну зі стін у списку, доки дві кімнати не мають однакової кількості, а потім попросіть одне з номерів у всі інші кімнати з тим самим номером. Продовжуйте рухатися, поки не закінчите стін. Це працює для прямокутних лабіринтів або, справді, будь-якого іншого лабіринту, де можна навести список "потенційно пов'язаних кімнат". Крім того, це досить просто програмувати.


1

Я також хотів би ознайомитися з деякими алгоритмами, які використовуються в розробці Roguelike. У басейні Rogue є гарний стартовий ресурс


1

Тут добре пробігаються: https://journal.stuffwithstuff.com/2014/12/21/rooms-and-mazes/

Основними кроками були:

  • Розмістіть кімнати
  • Заповніть порожній простір лабіринтом
  • Підключіть кімнати до лабіринту
  • Виріжте тупики

Код тут: https://github.com/muutiful/hauberk/blob/db360d9efa714efb6d937c31953ef849c7394a39/lib/src/content/dungeon.dart


0

Ви запитали, який я використовував, тож я обов’язково відповім на це. Я використовував рекурсивний алгоритм зворотного трекеру в моїй грі в лабіринті на Іграх Rootbeer .

Це свідчення того, що я використовував алгоритм, не розглядайте його як рекламу моєї роботи.

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