Generazione di Dungeon procedurali: esiste un semplice algoritmo per assicurarsi che tutte queste stanze siano collegate usando corridoi minimi?


9

È possibile ottenere una struttura simile ad un alveare, che collega tutte le stanze senza avere troppi corridoi? (Troppi sono 3-4 + corridoi provenienti da una stanza singola)

Di seguito è riportato l'output di come appaiono le mie stanze, in pratica sono posizionate casualmente.

uscita di una griglia, posizionata in modo casuale

Ciò che spero di ottenere in termini di corridoio.

http://i.imgur.com/9GUi6Yy.png


Non credo che 3 o 4 siano "troppi corridoi". Soprattutto se hai 9 stanze nel tuo sotterraneo. Inoltre, non sono sicuro di cosa intendi per "struttura simile ad un alveare", potresti approfondire l'aspetto che stai cercando di ottenere?
fnord,

Forse includi una mappa "completata" per mostrare ciò che ti interessa avere.
MichaelHouse

Ah sì, intendevo un massimo di 3 o 4 correttori provenienti da ogni stanza.
Blenderer

Ho aggiunto un'immagine di ciò a cui sto lavorando per quanto riguarda i corridoi.
Blenderer

2
Se non hai 3 corridoi da nessuna stanza, sarai in grado di creare un semplice collegamento lineare delle stanze, e quindi semplicemente sceglierne uno e unirlo ai suoi due vicini non uniti più vicini.
Nick,

Risposte:


6

Bene, il modo più semplice a cui riesco a pensare inizia assicurandomi che tutte le stanze siano collegate da almeno 1 corridoio:

  1. Inizia con l'ultima o la prima stanza.
  2. Prendi una stanza casuale a una distanza, che non è già collegata a una stanza (tutte le stanze iniziano a essere disconnesse, quindi tieni traccia di questo mentre vai).
  3. Se non esiste tale spazio, vai alla distanza +1. Se è possibile scavalcare sopra / sotto un'altra stanza, è più facile, supponendo che non si desideri collegare corridoi.
  4. Fatti strada in modo pseudo-casuale fino a quando tutte le stanze sono collegate.

Ora sappiamo che puoi raggiungere tutte le stanze, ma ora se vuoi qualcosa di più di questo labirinto rigorosamente lineare puoi semplicemente attraversare le tue stanze e creare in modo casuale un nuovo percorso per collegare le stanze, fino a un limite per stanza di 2-3, oppure fino a quando una determinata percentuale di camere raggiunge il numero massimo di connessioni, ecc.

Come passaggio finale puoi aggiungere regole che altererebbero i tuoi risultati per adattarsi a varie situazioni. Ad esempio, potresti notare che ogni stanza con solo 1 corridoio è, per definizione, un vicolo cieco; Potresti fare più vicoli ciechi o eliminarli tutti assicurandoti che tutto abbia almeno 2 connessioni. Puoi fare in modo che i vicoli ciechi abbiano un passaggio segreto. Potresti assicurarti che una stanza dei boss sia un vicolo cieco. Puoi assicurarti che la tua stanza iniziale sia un vicolo cieco, ma poi assicurati che la seconda stanza abbia un minimo di connessioni X. Verso l'infinito.

Ogni presupposto e regola può cambiare radicalmente l'aspetto dei tuoi livelli, ma fa parte del divertimento! Questo dovrebbe almeno farti iniziare in stanze simili ad alveari / caverne.


Questo è abbastanza vicino all'algoritmo di Spanning Tree minimo di Kruskal - questo modifica la condizione in 2 da "non già collegato a una stanza" a "non già connesso allo stesso cluster " che corregge un bug nelle regole sopra descritte dove si potrebbe avere un situazione in cui ogni stanza è collegata ad una stanza ma il sotterraneo nel suo insieme forma ancora più isole disconnesse. Kruskal è garantito per trovare un grafico di connessione con la lunghezza totale minima del corridoio.
DMGregory

3

Costruisci le tue stanze già collegate. Inizia con una stanza, quindi costruisci 1-3 corridoi verso altre stanze. Quindi ripeti finché non hai aggiunto abbastanza stanze.


2

Dal momento che queste stanze sono vertici del grafico incorporati in una pianura 2d, ciò potrebbe in teoria essere risolto risolvendo il problema del commesso viaggiatore (che andrebbe bene solo con poche stanze). Ovviamente, una semplice euristica andrebbe bene e consentirebbe una ragionevole scalabilità.

Calcoli i bordi (lunghezze del corridoio) tra tutte le stanze. Li ordina per lunghezza. Aggiungete il corridoio più corto a meno che non crei un ciclo o aumenti il ​​grado del vertice (stanza) al di sopra del valore massimo desiderato (3-4) (Ripeti). Per verificare la presenza di cicli, è possibile applicare UnionFind o eseguire un rapido BFS su dati di piccole dimensioni.


Questa risposta è migliore della risposta accettata. Una strategia avida di scegliere prima i corridoi di collegamento più brevi dovrebbe funzionare. Per evitare cicli, non effettuare collegamenti a stanze che hanno già un corridoio ad esse collegato.
Jelle van Campen,

@JellevanCampen Grazie. ;) Potresti avere due componenti collegati isolati. Quindi probabilmente vorrai usare union find o verificare con BFS se i due nodi sono connessi.
AturSams,

Ah sì, hai ragione, mio ​​male.
Jelle van Campen,
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.