Algoritmo per la generazione di un labirinto 2d [chiuso]


27

Quale algoritmo hai usato in passato per generare un semplice labirinto 2d?

Risposte:



8

Preferisco i labirinti strettamente avvolti che crea l'algoritmo di Kruskal.

La descrizione standard dell'algoritmo di Kruskal è inappropriata in quanto non riesce a distinguere le posizioni nel grafico dai gruppi di posizioni, facendo affidamento su un gioco di parole sulla scelta della struttura di dati, portando a ambiguità di descrizione che confondono i principianti. Pertanto rifiuto la termonologia di Kruskal.

Userò i seguenti termini:

  • Grafico
    • il labirinto stesso.
  • Nodo
    • una posizione nel labirinto. Su un labirinto quadrato, questa è una cella quadrata.
  • Bordo
    • la connessione tra due nodi. Su un labirinto quadrato, questa è una barra di 1 lunghezza.
  • Gruppo di alberi
    • un insieme di nodi, che possono essere vuoti, disposti come un albero

E da quelli otteniamo:

  1. Creare un gruppo GTG , per Graph Tree Group , contenente gruppi di alberi
  2. Popola GTG con un gruppo di alberi contenente un nodo, per ogni posizione nel tuo labirinto
  3. Creare un set di bordi E
  4. Popola E con tutti i bordi validi nel tuo labirinto
  5. Mentre c'è più di un gruppo in GTG e mentre E non è vuoto:
  6. Scegli un fronte casuale rE da E
  7. Identificare gli endpoint p1 e p2 di rE
  8. Rimuovere rE da E
  9. Controllare a quali gruppi p1 e p2 appartengono ( rispettivamente p1g e p2g ).
  10. Se p1g e p2g sono diversi, unire il gruppo di alberi p1g e p2g in p1 -> p2 e riscrivere tutta la proprietà del gruppo di un albero all'altro, unendo così gli alberi.
  11. Tornare al passaggio 5.
  12. Se non sono rimasti bordi, ma più di un albero, il grafico non è collegato o c'è un bug.
  13. Se hai solo un albero, hai un labirinto senza loop completo.

1
Avevamo un progetto GUI e dovevamo costruire un labirinto 2D casuale sulla GUI. Questo è esattamente come l'ho fatto e non mi ero mai reso conto che stavo usando Kruskals lol. Ho sicuramente capito di aver usato un grafico.
Bryan Harrington,


1

Un modo semplice è fare un elenco delle pareti nord e delle pareti ovest, quindi permutarle. Dai un numero a ogni stanza. Quindi fai esplodere una delle pareti dell'elenco, purché le due stanze non abbiano lo stesso numero, quindi propaga uno dei numeri a tutte le altre stanze con lo stesso numero. Continua finché non finisci i muri. Questo funziona per labirinti rettangolari o, in realtà, per qualsiasi altro labirinto in cui è possibile fornire un elenco di "stanze potenzialmente collegate". Inoltre, è abbastanza semplice da programmare.


1

Vorrei anche dare un'occhiata ad alcuni degli algoritmi utilizzati nello sviluppo di Roguelike. C'è una buona risorsa di partenza nel Rogue Basin



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.