Алгоритм создания 2d лабиринта [закрыто]


27

Какой алгоритм вы использовали в прошлом для создания простого 2d лабиринта?

Ответы:


21

Существует много разных способов изготовления лабиринтов. Их огромный список и их описания здесь: http://www.astrolog.org/labyrnth/algrithm.htm

Я думаю, что использовал тот, который описан в разделе «Идеальный».


Очень хороший ресурс, именно то, что я искал.
jdeseno

Люблю этот сайт, использовал его много лет назад.
Занлок

8

Я предпочитаю сильно намотанные лабиринты, которые создает алгоритм Крускала.

Стандартное описание алгоритма Крускала неуместно в том смысле, что оно не может отличить местоположения в графе от групп местоположений, в то же время полагаясь на каламбур в отношении выбора структуры данных, что приводит к неясностям описания, которые смущают новичков. Поэтому я отвергаю терминологию Крускала.

Я буду использовать следующие термины:

  • график
    • сам лабиринт.
  • Узел
    • место в лабиринте. На квадратном лабиринте это квадратная клетка.
  • край
    • связь между двумя узлами. На квадратном лабиринте это бар длиной 1.
  • Дерево Группа
    • набор узлов, которые могут быть пустыми, организованы в виде дерева

И из них мы получаем:

  1. Создайте группу GTG для группы дерева графиков , содержащую группы деревьев
  2. Заполните GTG одной группой деревьев, содержащей один узел, для каждого местоположения в вашем лабиринте
  3. Создать набор ребер E
  4. Заполните E каждым действительным краем в вашем лабиринте
  5. Пока в GTG более одной группы , и пока E не пусто:
  6. Выберите случайное ребро RE из E
  7. Определить конечные точки p1 и p2 для rE
  8. Удалить РЭ из Е
  9. Проверьте, к каким группам p1 и p2 относятся ( p1g и p2g соответственно).
  10. Если p1g и p2g различаются, соедините группы деревьев p1g и p2g в p1 -> p2 и переписайте все группы владения одним деревом в другое, таким образом соединяя деревья.
  11. Вернитесь к шагу 5.
  12. Если у вас не осталось ребер, но имеется более одного дерева, либо график не связан, либо есть ошибка.
  13. Если у вас есть только одно дерево, у вас есть полный лабиринт без петель.

1
У нас был проект с графическим интерфейсом, и мы должны были построить случайный 2D лабиринт на графическом интерфейсе. Именно так я и сделал, и я так и не понял, что использую Kruskals lol. Я определенно понял, что использовал график.
Брайан Харрингтон


1

Один простой способ - составить список северных и западных стен, а затем их переставить. Дайте каждой комнате номер. Затем взорвать одну из стен в списке, пока две комнаты не имеют одинаковое число, а затем распространить одно из номеров на все другие комнаты с одинаковым номером. Продолжайте, пока не выбежите из стен. Это работает для прямоугольных лабиринтов или, на самом деле, для любого другого лабиринта, где вы можете дать список «потенциально связанных комнат». Плюс, это довольно просто программировать.


1

Я также хотел бы взглянуть на некоторые алгоритмы, используемые в разработке Roguelike. В Rogue Basin есть хороший стартовый ресурс


1

Хороший прогон есть здесь: https://journal.stuffwithstuff.com/2014/12/21/rooms-and-mazes/

Основные шаги были:

  • Место комнаты
  • Заполните пустое пространство лабиринтом
  • Соедините комнаты с лабиринтом
  • Выкроить тупики

Код здесь: https://github.com/munificent/hauberk/blob/db360d9efa714efb6d937c31953ef849c7394a39/lib/src/content/dungeon.dart


0

Вы спросили, какой я использовал, поэтому я обязательно отвечу на это. Я использовал Рекурсивный алгоритм Backtracker в моей игре-лабиринте на Rootbeer Games .

Это доказательство того, что я использовал алгоритм, пожалуйста, не рассматривайте его как рекламу моей работы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.