Come devo ripianificare A *?


10

Ho un boss nemico che cerca il percorso e cerca il giocatore usando l'algoritmo A *. È un ambiente piuttosto complesso, e lo sto facendo in Flash, quindi la ricerca può rallentare un po 'quando si cerca su lunghe distanze. Se il giocatore era fermo, potrei solo cercare una volta, ma al momento sto cercando ogni fotogramma. Questo richiede abbastanza tempo che il mio framerate soffre.

Qual è la solita soluzione a questo? C'è un modo per "ripianificare" A * senza ripetere l'intera ricerca? Dovrei solo cercare un po 'meno spesso (ogni mezzo secondo o secondo) e accettare che ci sarà una piccola imprecisione nel percorso?

Risposte:


13

Non devi cercare l'intero percorso in un frame, l'ho fatto dando un limite al loop di ricerca, l'IA inizierà quindi a seguire le poche informazioni che ha, e il frame successivo cercherò ancora , potrebbero essere necessari 3 frame fino a quando non viene trovato il percorso. Può sembrare abbastanza convincente, poiché sembra che l'IA stia effettivamente cercando.


+1. Questo è anche ciò che Mat Buckland descrive nel suo libro AI. Lo chiama "Pianificazione del percorso a fasce orarie " ( books.google.ch/… ). Roba buona.
Bummzack,

8

È possibile utilizzare il rilevamento di prossimità per eseguire l'algoritmo ogni pochi frame se la distanza è molto grande (perché nella maggior parte dei casi se la distanza è grande, il percorso target non cambierà drasticamente da frame a frame). Per esempio:

      Distance > 100, run A* every 2 seconds
100 > Distance >  50, run A* every 1 second
50  > Distance >  25, run A* every 10 frames
25  > Distance <  25, run A* every frame

Ciò presuppone che vi sia una distanza in cui l'esecuzione A * di ogni fotogramma presenta prestazioni ancora accettabili. In breve, sceglierei la tua seconda opzione. Soprattutto se ciò che hai funziona, eviterei di reimplementare qualcos'altro se solo potessi ridimensionare ciò che funziona bene. La linea di fondo è che dovrai provarlo per vedere se funziona per il tuo gioco.


8

Non rispondo davvero alla tua domanda esatta, ma ... se sei disposto a "imbrogliare", puoi far lasciare al giocatore "pangrattato" e far sì che il capo li segua. Se il percorso del pangrattato si incrocia da solo, segui il più recente (questo fa sì che il boss eviti loop e altri percorsi che potrebbero essere troppo lunghi, per non parlare del non seguire il percorso esatto del giocatore)

Funzionerebbe bene se il capo fosse una specie di animale con un buon senso dell'olfatto. Funzionerebbe molto come seguire il profumo del giocatore :)


5

Il tuo caso è praticamente quello a cui HPA * è stato inventato. Se sembra eccessivo, tuttavia, tenderei a pensare che la ricerca del percorso ogni mezzo secondo circa dovrebbe funzionare abbastanza bene.


4

Se si tratta di un ambiente statico, è possibile precalcolare il percorso più breve di tutte le coppie.


2
Se è un piccolo ambiente statico.

Dipende dalla piattaforma e dalla memoria disponibili.
Nate,

@Joe, @Nate, true.
Peter Taylor,

2

Ho creato un gioco per una competizione a 48 partite in cui un personaggio A * segue il giocatore attorno a un livello. Poiché la mia implementazione A * era lenta (non poteva eseguire tutti i frame) ho messo l'intervallo su un ritardo di tre secondi. Ciò ha avuto il risultato involontario di consentire al giocatore di "ingannare" l'IA per alcuni momenti. In realtà ha reso il gioco più divertente.

Successivamente, ho migliorato le prestazioni dell'implementazione A * e ho provato a eseguirlo su ogni frame. Il gioco ha smesso di essere divertente perché il nemico avrebbe sempre cercato perfettamente il giocatore.

È stata inaspettata e una bella esperienza di apprendimento.


1
È un buon punto. Ricordo di aver letto del percorso trovato in pac-man in cui hanno deliberatamente usato un algoritmo imperfetto, permettendo al giocatore di superare in astuzia i fantasmi. Ogni fantasma aveva un'imperfezione leggermente diversa che conferiva loro più carattere. Il take away qui è che nei giochi, il divertimento> tutto il resto.
Nick Van Brunt

0

A meno che tu non voglia assolutamente (o abbia bisogno) di usare A *, potresti anche dare un'occhiata a Comportamenti di guida . Poiché non è prevista una pianificazione completa del percorso per frame, dovrebbe essere molto più leggera nell'elaborazione.


Uso Steering Behaviors (in particolare Seek) nei casi in cui non vi siano ostacoli tra l'agente e il suo obiettivo. Sfortunatamente, il mio ambiente contiene cose come i corridoi tortuosi, dove è necessaria una soluzione più intelligente.
Gregory Avery-Weir,
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.