Algoritmo para generar un laberinto 2D [cerrado]

27

¿Qué algoritmo has usado en el pasado para generar un laberinto 2D simple?

jdeseno
fuente

Respuestas:

21

Hay muchas formas diferentes de hacer laberintos. Hay una gran lista de ellos y sus descripciones aquí: http://www.astrolog.org/labyrnth/algrithm.htm

Creo que usé el que se describe en "Perfecto".

Tétrada
fuente
Muy buen recurso, exactamente lo que estaba buscando.
jdeseno
Me encanta ese sitio, lo usé hace muchos años.
zanlok
8

Prefiero los laberintos apretados que crea el algoritmo de Kruskal.

La descripción estándar del Algoritmo de Kruskal es inapropiada ya que no distingue las ubicaciones en el gráfico de los grupos de ubicaciones, al tiempo que se basa en un juego de palabras sobre la elección de la estructura de datos, lo que lleva a ambigüedades de descripción que confunden a los novatos. Por lo tanto, rechazo la termonología de Kruskal.

Usaré los siguientes términos:

  • Grafico
    • El laberinto en sí.
  • Nodo
    • Una ubicación en el laberinto. En un laberinto cuadrado, esta es una celda cuadrada.
  • Borde
    • La conexión entre dos nodos. En un laberinto cuadrado, esta es una barra de 1 longitud.
  • Grupo de árboles
    • Un conjunto de nodos, que pueden estar vacíos, dispuestos como un árbol

Y de esos, obtenemos:

  1. Cree un grupo GTG , para el grupo de árbol de gráfico , que contenga grupos de árbol
  2. Rellene GTG con un grupo de árbol que contiene un nodo, para cada ubicación en su laberinto
  3. Crear un conjunto de bordes E
  4. Rellene E con cada ventaja válida en su laberinto
  5. Si bien hay más de un grupo en GTG , y mientras E no está vacío:
  6. Elija un borde aleatorio rE de E
  7. Identificar los puntos finales p1 y p2 de rE
  8. Eliminar rE de E
  9. Compruebe a qué grupos pertenecen p1 y p2 ( p1g y p2g respectivamente).
  10. Si p1g y p2g son diferentes, únase al grupo de árboles p1g y p2g en p1 -> p2 , y reescriba toda la propiedad del grupo de un árbol al otro, uniendo así los árboles.
  11. Regrese al paso 5.
  12. Si no le quedan bordes, pero hay más de un árbol, el gráfico no está conectado o hay un error.
  13. Si solo tiene un árbol, tiene un laberinto completo sin bucles.
John Haugeland
fuente
1
Teníamos un proyecto GUI y tuvimos que construir un laberinto 2D aleatorio en la GUI. Así es exactamente como lo hice y nunca me di cuenta de que estaba usando Kruskals jajaja. Definitivamente me di cuenta de que había usado un gráfico.
Bryan Harrington
1

Una manera fácil es hacer una lista de los muros norte y oeste, y luego permutarlos. Dale un número a cada habitación. Luego explote una de las paredes de la lista, siempre y cuando las dos habitaciones no tengan el mismo número, luego propague uno de los números a todas las otras habitaciones con el mismo número. Sigue hasta que te quedes sin paredes. Esto funciona para laberintos rectangulares o, en realidad, cualquier otro laberinto en el que pueda dar una lista de "habitaciones potencialmente conectadas". Además, es bastante sencillo de programar.


fuente
1

También echaría un vistazo a algunos de los algoritmos utilizados en el desarrollo de Roguelike. Hay un buen recurso inicial en Rogue Basin

Casey
fuente
0

Usted preguntó cuál usé, así que me aseguraré de responder eso. Utilicé el algoritmo Recursive Backtracker en mi juego de laberinto en Rootbeer Games .

Esto es evidencia de que utilicé el algoritmo, por favor no lo vea como un anuncio de mi trabajo.

BenMaddox
fuente