Come individuare un ostacolo?


10

Come rappresentare al meglio la seguente situazione: agent ( @) deve raggiungere l'obiettivo ( $). Il percorso è bloccato da un fossato ( ~~~). È disponibile un rastrello (o qualche altro dispositivo, come stivali da waterwalking) che consentirà di attraversare l'ostacolo.

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

Come trovare correttamente pathfind da @a $purché non ci sia un percorso immediatamente disponibile? Il mio percorso non dovrebbe avere solo costi, ma anche prerequisiti?

UPD : il problema è che l'obiettivo non è accessibile e il rake è solo uno dei tanti oggetti possibili sulla mappa. La domanda quindi è "come far capire all'agente che ha bisogno del rastrello?"


Penso che dovresti chiarire il tuo caso d'uso perché ciò influenzerebbe l'approccio adottato per risolvere questo problema. Ad esempio, se il caso d'uso è di calcolare i percorsi per i nemici, probabilmente dovresti prima vedere se l'obiettivo può essere raggiunto attualmente, altrimenti i nemici ottengono il rastrello (cioè il rastrello È l'obiettivo) e quindi il percorso verso il primo obiettivo di nuovo.
jhocking

Risposte:


6

Sto pensando a una serie di obiettivi, il pathfinding dovrà essere annotato :

  • Inizia con un obiettivo get $
  • Prova a trovare il percorso per $ - il percorso esiste con capacità di camminata sull'acqua richiesta.
  • Spingere obiettivo get waterwalking .
  • Lo stack degli obiettivi è ora get waterwalking, get $
  • In qualche modo scopri che il rastrello dà waterwalking, rinominiamolo in barca.
  • Percorso da rastrellare. L'obiettivo più alto raggiunto, saltalo dallo stack, l'obiettivo èget $ .
  • Percorso verso $- ora abbiamo capacità e possiamo raggiungere l'obiettivo.

1
+1 Ho fatto qualcosa di simile con il mio gioco, e ho scritto un post su di esso un po 'di tempo sotto Task unità e pathfinding .
MichaelHouse

@ byte66 non gestisce il caso speciale quando esiste un percorso senza usare il rake ma, usando il rake, si ottiene un percorso più breve
Ali1S232

@ Gajet hai ragione. Indovina avrà bisogno di un approccio diverso per quello.
zzandy,

1
Si tratta solo di aggiungere costi aggiuntivi. Quando incontri l'acqua, aggiungi il costo per ottenere l'oggetto che cammina sull'acqua nel percorso. Un * salterà la camminata in acqua fino a quando non diventa il percorso più economico.
MichaelHouse

3

L'intero percorso per trovare elementi è solo una ricerca del percorso più breve su un grafico. per risolvere il tuo problema, l'unica modifica che devi applicare è quella di aggiungere alcuni spigoli extra (che rappresentano il percorso che la barca può prendere) e fare un semplice algoritmo di ricerca del percorso. non importa se si utilizza BFS, Dijkstra o A *, basta implementare un normale algoritmo di ricerca del percorso con alcuni bordi extra. per ulteriori informazioni sulla ricerca di percorsi in un grafico, consultare la pagina wiki


+1 Trasforma il tuo rastrello in un modo unidirezionale verso l'acqua, con acqua-terra essendo anche collegamenti unidirezionali.
Laurent Couvidou,

Non ho una chiara comprensione di come unire ricerca geometrica e ricerca di funzionalità. Come andare da no path from @ to $a goto rake, bring it to water, place it, goto $.
zzandy,

@zzandy durante la ricerca del percorso, per ogni tessera vai alle tessere più vicine se possibile. devi solo aggiungere una condizione che se il nodo corrente è un rake, puoi aggiungere direttamente un nodo dall'altra parte del fiume per aprire la lista.
Ali1S232,

E se fosse possibile trasportare il dispositivo? Pensavo che fosse quello che intendeva dire (e quindi la mia risposta)
kaoD,

Sì, intendo che il dispositivo può (e deve) essere curato. @kaoD, la tua risposta non include il passaggio in cui un agente ottiene l'idea di aver bisogno del rastrello.
zzandy,

2

Lo farei con una sorta di soluzione ad albero comportamentale: ti dirigi verso l'obiettivo e prenderò nota di tutti gli ostacoli che hanno bloccato il tuo A *. Se fallisci, controlli se ci sono oggetti che possono aiutare a superare quegli ostacoli, in quel caso, il percorso verso quell'oggetto. Ripetere. Ciò significa che l'agente deve cercare di raggiungere l'obiettivo e fallire prima di avere l'idea di usare gli strumenti, il che potrebbe richiedere del tempo, specialmente se c'è un enorme mondo di tessere che devono essere controllate tutte. Potrebbe non sembrare troppo fuori posto che l'agente impiega del tempo a riflettere su come risolvere il problema.

Posso immaginare una vera soluzione hardcore, tuttavia. Aggiungi un'altra dimensione alla griglia di ricerca del percorso. Quindi, nel caso di una mappa 2D, crei la griglia di tracciamento 3D. In questo semplice esempio questa nuova dimensione avrebbe solo una profondità di due, ma in un gioco reale diventerebbe rapidamente grande.

A z = 0 si mappa il terreno in circostanze normali, il che significa che le tessere dell'acqua sono considerate impraticabili.

A z = 1 si mappa il terreno così com'è mentre si ha il rastrello, il che significa che le piastrelle d'acqua sono considerate percorribili (ma se si hanno ad esempio piastrelle da parete, quelle potrebbero rimanere solide).

La ricerca del percorso è un normale A * nelle dimensioni xey, il che significa che ogni cella della griglia ha accesso ai suoi vicini. Nella dimensione z, tuttavia, A * NON è autorizzato a diffondersi.

Tranne dove si trova il rastrello. L'oggetto rake funge da apertura tra z = 0 e z = 1 nella griglia di ricerca del percorso.

Ciò significa che A * si riempirà inondando verso l'esterno in z = 0, colpirà l'acqua ed esaurirà le opzioni - quindi si diffonderà a z = 1 attraverso la tessera del rastrello e in z = 1 (dove l'acqua è percorribile) trova la sua strada verso l'obiettivo. L'effetto è che l'NPC senza esitazione si sposta sul rastrello e quindi sposta il percorso più breve verso l'obiettivo.


Ho trattato il rastrello più come "scarponi da passeggio" nel mio esempio, intendendo un oggetto che se lo hai ti rende in grado di viaggiare su piastrelle d'acqua. Se il rastrello deve essere effettivamente "costruito" come un pezzo di terreno e copre una quantità limitata di tessere che potrebbero essere o non essere abbastanza per raggiungere attraverso l'acqua, il problema è più difficile. Tuttavia, la mia soluzione consente l'uso di oggetti monouso, se si sposta in z = 1 automaticamente, si scende di nuovo a z = 0.
Joar Jakobsson,
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.