Ricerca di percorsi con più percorsi casuali in un gioco di Tower Defense


8

Ho pensato a percorsi casuali per il mio gioco Tower Defense. Un * non funzionerebbe per i miei alunni, perché ho specificamente bisogno di un pathfinding casuale .

Immagina una mappa con percorsi, un punto di partenza e una destinazione. Ho più percorsi, che conducono tutti dal punto di partenza alla destinazione, in un modo o nell'altro. Potrebbe apparire così:


Un percorso a due rami a forma di quadrato

Descrizione del colore: rosso - punto di partenza; nero - destinazione; gray - route; bianco - spazio libero
(I numeri sono usati nel testo come riferimento ad alcune tessere)


Prima ho pensato di calcolare casualmente il waypoint successivo, quando un'entità passa una tessera. Ma ciò non funzionerebbe. Quando un'entità passa la tessera 1, può salire o scendere. Quando si tratta di 2, può andare su / giù (rispetto alla sua posizione) o a destra.
Se scende / sale andrebbe al riquadro 1, il che significa che va indietro. Cattivo...

Mi piacerebbe davvero renderlo dinamico , ma non riesco a capire cosa posso fare ora. Qualcuno con idee o esperienza in questo?


La maggior parte dei giochi di difesa della torre di cui sono a conoscenza fanno fare in modo che le cose strisciano sul percorso più corto verso l'uscita e blocchino qualsiasi mossa che invalidi l'uscita dall'uscita ... La parte difficile qui sarebbe assicurarsi di ricalcolare i percorsi quando il giocatore cambia il layout della torre
James,

@James: Intendi ottenere il percorso più breve, che è A *, o intendi strisciare attraverso i waypoint per ottenere indicazioni valide per ogni riquadro. Inoltre non ho bisogno di ricalcolare il percorso poiché i miei modi sono fissi e il giocatore non può posizionare torri lì. Ma in generale hai ragione.
Marco,

Risposte:


4

Invece di avere tutti i quadrati adiacenti il ​​più vicino possibile a waypoint, includi solo quadrati che non riportano all'inizio e scegli casualmente da quelli. Se lo facessi, sarebbe impossibile tornare indietro perché tornare indietro non è un'opzione.

Questo è un problema di grafico diretto con ciascun waypoint come vertice e ogni percorso un bordo. Devi solo limitare il numero di cicli, magari rimuovendoli del tutto.


Quello era il mio secondo pensiero. Devo pensare all'implementazione della cosa "il modo in cui ora torna". Limitare il numero di tessere da passare non sarebbe dinamico e flessibile.
Marco,

Puoi risolverlo costruendo un grafico diretto e tenendo traccia delle tessere visitate / non visitate. Quindi assicurati solo di cercare solo riquadri non visitati. Ciò dovrebbe costruirti un grafico che rappresenti i tuoi percorsi. Ora se colpisci una tessera in cui una nota ha diversi spigoli in uscita (nel grafico che è stato precedentemente costruito), scegline uno a caso.
bummzack,

Volevo scrivere "nodo" non "nota" nel mio commento precedente. Scusate.
Bummzack,

@bummzack: No, non funzionerebbe. Immagina una mappa con 3 percorsi. Se cerco nodi non visitati, potrei anche semplicemente andare all'inizio. Penso all'implementazione di un algoritmo che striscia sulla mappa e sceglie casualmente tra le direzioni. Quando si rende conto che risale all'inizio questa parte è inutilizzabile. Potrei farlo con un contatore. Quando la distanza all'inizio si riduce, torna indietro. Questo verrà analizzato una volta durante la creazione della mappa nel processo di sviluppo, quindi non ci sono problemi di prestazioni.
Marco,

@Marco Perché non dovrebbe funzionare? Se implementi una prima ricerca ampia dal tuo nodo iniziale, non visiterai più i nodi precedenti. Non tornerai mai all'inizio, perché è molto simile a un diluvio.
bummzack,

7

Tu dici casuale, ma quanta casualità vuoi? Va bene se i nemici scelgono un percorso che è 10 volte più lungo di quello più breve? Va bene se i nemici entrano in un vicolo cieco e devono tornare indietro? Cioè, casuale su quale serie di percorsi e con quale distribuzione di probabilità?

Supponendo che si desideri che i nemici preferiscano percorsi brevi, è possibile utilizzare A *, ma variare casualmente i pesi del bordo alimentati. Quindi, i nemici sceglieranno sempre un percorso casuale che visita ogni nodo al massimo una volta, con una tendenza verso percorsi più brevi. In particolare, se senza randomizzazione esistessero diversi percorsi della stessa lunghezza, ognuno di questi percorsi verrebbe scelto con uguale probabilità.

In alternativa, in A *, è possibile scorrere i vicini in ordine casuale. Nel tuo eaxmple, quando la ricerca del percorso raggiunge il nodo 1, accoderebbe per prima la parte superiore del vicino inferiore, facendo considerare prima il percorso superiore o inferiore. Questa soluzione indurrebbe i nemici a scegliere casualmente tutti i percorsi più brevi. Nel tuo semplice esempio, entrambi i percorsi più brevi sarebbero ugualmente probabili, ma in una situazione come:

start -+--------+
       |        |
       +--------+
       |        |
       +--------+- end

il percorso superiore verrebbe scelto alla probabilità 1/2, mentre quelli inferiori verrebbero scelti alla probabilità 1/4 ciascuno.


Non sono sicuro di cosa significhi esattamente l'OP con "pathfinding casuale", ma la tua soluzione per scegliere casualmente tra tutti i percorsi più brevi è ciò che suppongo intendesse dire, e il tuo "alternativamente ecc" è un'ottima soluzione per quel problema.
masturbarsi il

0

Solo una prova di concetto:

  1. Scegli una direzione casuale.
  2. Se questo ci farebbe andare in un posto in cui siamo già stati, scegli un'altra direzione.
  3. Se abbiamo esaurito le indicazioni, torna all'ultima casella con una direzione inesplorata.
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.