Problema da risolvere: genera una mappa sotterranea 2D casuale per un gioco basato su tessere in cui tutte le stanze sono collegate.
Sto cercando soluzioni migliori di quelle che ho attualmente.
La mia soluzione attuale è che eseguo due algoritmi. Il primo genera la prigione con le sue stanze. Il secondo si assicura che tutte le stanze siano collegate. Sono curioso di sapere quali altre soluzioni possano esistere. Più veloce e / o più facile, ecc. La velocità non è realmente un problema, ma se la velocità può essere ottenuta senza costi reali, allora è una buona cosa. Più importante è che io e gli altri che leggiamo, possiamo imparare diversi modi di affrontare e risolvere il problema.
Di seguito sono riportate le mie attuali implementazioni. Le camere attualmente non hanno uscite o uscite in nessuna delle 2, 3 o 4 direzioni.
Generare le stanze dei sotterranei
Impostazione: imposta la stanza corrente nella stanza in alto a sinistra.
- Ottieni un tipo di stanza valido per la stanza (dove il tipo di stanza valido è un tipo senza uscite fuori dal sotterraneo e con uscite che corrispondono alle uscite della stanza sopra e della stanza a sinistra. Devi solo controllare sopra e verso lasciato a causa del passaggio 2 di seguito).
- Metti giù la stanza e fai avanzare la coordinata x di un passo. Se la coordinata x supera la larghezza del dungeon, imposta la coordinata x su 0 e avanza di un passo sulla coordinata y. Se la coordinata y supera l'altezza del sotterraneo, abbiamo finito.
- Ripeti dal n. 1.
Poi controllo per vedere se tutte le stanze sono collegate Se non sono tutte collegate, eseguo un secondo algoritmo che, in modo non sexy ma decisamente abbastanza buono in termini di layout del sotterraneo, attraversa le stanze e le cambia in modo che tutto finisca essere connesso.
Verifica se tutte le stanze sono collegate
Impostazione: crea una mappa 2D di numeri interi che rappresentano i percorsi e inizializza le voci su un valore "non elaborato" (non ancora attraversato), -1. Impostare un numero intero indice del percorso iniziale che tiene traccia del percorso corrente su 1. Impostare la stanza corrente nella stanza in alto a sinistra aggiungendola a una pila di stanze da controllare.
- Se la pila contiene stanze da controllare, aprila imposta l'indice del percorso della stanza sull'indice del percorso corrente. Se la pila non contiene stanze, aumenta l'indice del percorso e prova a ottenere una stanza avanzando colonna per colonna, riga per riga, fino a quando non otteniamo una stanza che non è stata ancora elaborata. Se non è possibile trovare spazio, abbiamo finito.
- Controlla se la stanza ha un'uscita a sinistra. Se ha aggiunto la stanza sinistra alla pila se non è già presente.
- Ripetere il passaggio 2 per le direzioni verso il basso, a destra e in alto (poiché stiamo usando una pila che significa che le stanze vengono attraversate in senso orario, iniziando dalla direzione superiore).
- Ripetere dal passaggio 1.
- Se il conteggio degli indici di percorso è maggiore di uno, ci sono stanze disconnesse.
Se ci sono stanze disconnesse, raggruppo le stanze in base all'indice del percorso, ottengo l'indice del percorso più grande e collego tutte le altre stanze a quelle stanze. Questo è un lavoro in corso, ma il mio piano (attuale, "brutale") è quello di passare attraverso ogni stanza in un gruppo di stanze (tranne il primo) per vedere se c'è un percorso orizzontale o verticale al gruppo di stanze del biggeset, e in tal caso, creare un percorso orizzontale / verticale lì iniettando / aggiornando le stanze tra di loro. Risciacqua e ripeti. Brutto, sì, ma è qualcosa che non sarà evidente in termini di modello visivo, quindi funziona in quel senso.