Garantire la risoluzione del labirinto di mappe di case con ascensori?


13

Nel mio gioco vediamo i piani di una casa di lato e l'eroe può prendere gli ascensori: un ascensore può salire (fino al prossimo ascensore verso l'alto) o verso il basso (fino al prossimo ascensore verso il basso), a seconda della freccia come mostrato, e c'è sempre una coppia di esattamente due ascensori collegati. Questo è l'unico modo in cui l'eroe può muoversi verticalmente, sebbene possa muoversi liberamente in orizzontale. La mappa della casa è una griglia 11x5 randomizzata con elementi diversi e muri non superabili all'estrema sinistra, all'estrema destra e talvolta in una delle due posizioni centrali:

esempio di ascensori

La mia domanda: come posso assicurarmi che la mappa sia sempre randomizzata ma sempre risolvibile e che l'eroe, a partire dal lato sinistro del piano inferiore, possa sempre lasciarla tramite qualsiasi ascensore rivolto verso l'alto all'ultimo piano?

Per quello che vale sto usando il linguaggio Lua per lo sviluppo. Grazie mille!

Risposte:


14

Quello che vuoi fare è creare un grafico tale che ogni nodo sia una posizione di elevazione, e i bordi tra di loro significano che puoi camminare / sollevare lì. Una volta creato il grafico, puoi usare dfs / bfs per vedere se riesci a passare dal nodo iniziale al nodo finale.

Usando il tuo esempio sopra ho fatto una foto di come sarebbe il grafico. I cerchi verdi indicano che c'è un ascensore lì e le linee verdi indicano che puoi viaggiare da un nodo all'altro.

nodi


Grazie, è molto utile! Avrei dovuto sottolineare maggiormente nella mia domanda che la mappa deve anche essere generata in primo luogo. Ciò su cui sto riflettendo è se potrebbe non essere più facile - piuttosto che generare ripetutamente combinazioni di sollevamento / parete completamente casuali e verificarne la solvibilità - far passare l'algoritmo attraverso la casa, come farebbe l'eroe, e in questo modo generare ascensori e porte casuali (prendendo distanze di sollevamento casuali e svolte da sinistra a destra, nonché aggiungendo muri, per esempio). Come in "Cammina a destra o 0, 4 o 8 giri; crea un ascensore verso l'alto,
sali

@PhilippLenssen Questo è essenzialmente l'approccio "randomizzato della prima ricerca di profondità" alla generazione di labirinti su un grafico.
Kevin Reid,

5

La differenza tra ciò che hai e un labirinto normale è semplicemente che ha connessioni non adiacenti in verticale. Penso che ciò che dovresti guardare siano algoritmi di generazione di labirinti basati su grafici . Devi semplicemente avere una serie più ampia di "stanze adiacenti" o "possibili pareti" rispetto a un normale labirinto 2D, in quanto ogni coppia di celle della griglia del pavimento allineate verticalmente che non ha già un ascensore intermedio è adiacente. È possibile modellarlo come un grafico in cui l'aggiunta di spigoli di sollevamento definiti elimina accidentalmente altri possibili spigoli di sollevamento; alcuni algoritmi potrebbero essere confusi da questo, ma non altri.

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.