Come posso modificare questo algoritmo di ricerca del percorso di ricerca A * per gestire valori di movimento del terreno diversi?


8

Sto creando un gioco d'azione basato su mappe 2D con un design di interazione simile a quello di Diablo II. In altre parole, il giocatore fa clic su una mappa per spostare il proprio giocatore. Ho appena finito il movimento del giocatore e sto passando al pathfinding.

Nel gioco, i nemici dovrebbero caricare il personaggio del giocatore. Esistono anche cinque diversi tipi di terreno che offrono diversi bonus di movimento. Voglio che l'intelligenza artificiale tragga vantaggio da questi bonus terreno mentre provano a raggiungere il giocatore.

Mi è stato detto di dare un'occhiata all'algoritmo di ricerca A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Sto facendo questo gioco in HTML5 e JavaScript e ho trovato una versione in JavaScript: http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript Sto cercando di capire come modificarlo anche se.

Di seguito sono riportate le mie idee su cosa devo cambiare. Di cos'altro devo preoccuparmi?

  • Quando creo un grafico, dovrò inizializzare l'array 2D in cui mi trasferisco trasmesso con un attraversamento di una mappa che corrisponde ai diversi tipi di terreno.
  • in graph.js: la definizione "GraphNodeType" deve essere modificata per gestire i 5 tipi di terreno. Non ci saranno muri.
  • in astar.js: Il g ed h punteggio dovrà essere modificato. Come dovrei farlo?
  • in astar.js: isWall () probabilmente dovrebbe essere rimosso. Il mio gioco non ha muri.
  • in astar.js: non sono sicuro di cosa si tratti. Penso che indichi un nodo che non è valido per essere elaborato. Ma quando sarebbe successo?
  • Ad alto livello, come posso cambiare questo algoritmo da "oh, c'è un muro lì?" a "questo terreno mi porterà al giocatore più veloce del terreno intorno a me?"

A causa del tempo, sto anche discutendo di riutilizzare il mio algoritmo di Bresenham per i nemici. Sfortunatamente, i diversi bonus di movimento del terreno non saranno utilizzati dall'intelligenza artificiale, il che farà schifo il gioco. : / Mi piacerebbe davvero avere questo per il prototipo, ma non sono uno sviluppatore di commercio né sono un informatico. : D

Se conosci qualche codice che fa quello che sto cercando, ti preghiamo di condividere!

Anche i suggerimenti per il controllo della sanità per questo sono apprezzati.


Ehi, autore della biblioteca qui. Stai usando l'ultima versione di Github? github.com/bgrins/javascript-astar/blob/master/astar.js . È molto più veloce della vecchia implementazione basata su elenco.
Brian Grinstead,

Risposte:


7

Devi prestare attenzione a una riga molto specifica dell'algoritmo:

// g score is the shortest distance from start to current node, we need to check if
//   the path we have arrived at this neighbor is the shortest one we have seen yet
var gScore = currentNode.g + 1; // 1 is the distance from a node to it's neighbor

Questo è il costo di quel particolare nodo. Vorresti modificarlo in qualcosa del genere

var gScore = currentNode.g + currentNode.cost

Ciò farà sì che il percorso eviti terreni costosi e preferisca terreni economici; è tua responsabilità fare in modo che "currentNode.cost" restituisca qualcosa di appropriato per il tuo terreno. È il fatto che non tutti i terreni hanno un costo di 1 a cui stai prestando attenzione ... alcuni terreni sono più economici di altri. Ci sono altre considerazioni, ma questo punto specifico nel codice dovrebbe essere al centro della tua attenzione.


Grazie per questo. Ho modificato il mio codice in modo che ogni nodo cerchi il pixel in corrispondenza delle sue coordinate e lo memorizzi come costo. Sfortunatamente, ho fatto un test pathfind tra due punti sulla mia griglia 800x500 e il mio browser si blocca. : / Ci sono diversi fattori in questo: il codice astar potrebbe aver bisogno di ottimizzazione; la mia dimensione della tela è enorme; forse la mia inizializzazione del grafico è sbagliata; e forse i colori sugli avatar dei personaggi stanno rovinando le cose. Cosa dovrei fare? :(
user422318

Quando dici "archivia il pixel", intendi che memorizza il costo del terreno del pixel, sì? Perché è improbabile che un certo valore RGB corrisponda al costo effettivo di quel pezzo di terreno. Probabilmente dovresti conservare qualcosa tra 1 e 10 (1 è una strada, 10 è una palude), anche se i valori esatti dipendono ovviamente dal tuo gioco preciso.
Myrddin Emrys il

1
Ehi, autore della biblioteca qui. Stai usando l'ultima versione di Github? github.com/bgrins/javascript-astar/blob/master/astar.js . È molto più veloce della vecchia implementazione basata su elenco.
Brian Grinstead,

2
@Brian Dovresti mettere questo commento alla domanda, piuttosto che alla mia risposta, in modo che la persona che sta effettivamente usando la biblioteca riceverà la notifica nella sua e-mail piuttosto che a me.
Myrddin Emrys,

2

Questo è esattamente il tipo di cosa A * è per. Tutto quello che devi fare è assegnare i vertici tra i costi dei nodi in base ai tipi di terreno. (Sembra che i tuoi esempi utilizzino un grafico in cui tutti i vertici hanno un costo di 1.)


0

Questa implementazione è un po 'specifica per l'attivazione / disattivazione in questo momento. Come dice Myrddin Emrys, dovrai modificare il punteggio g in base al costo (anziché solo di 1). C'è stata una discussione al riguardo qui: https://github.com/bgrins/javascript-astar/issues/3 .

Mi piacerebbe riportare questa soluzione nella libreria principale se riesci a farlo funzionare!

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.