Muoversi / evitare ostacoli


12

Vorrei scrivere un "gioco", in cui è possibile posizionare un ostacolo (rosso), quindi il punto nero cerca di evitarlo e raggiungere il bersaglio verde.
Sto usando un modo molto semplice per evitarlo, se il punto nero è vicino al rosso, cambia direzione e si sposta per un po ', quindi si sposta in avanti verso il punto verde.
Percorso "non realistico"

Come potrei creare un percorso "liscio" per il "giocatore" controllato dal computer?
Modifica: non la scorrevolezza è il punto principale, ma per evitare il "muro" di blocco rosso e non schiantarsi su di esso e quindi evitarlo.

Come potrei implementare un algoritmo di ricerca del percorso se avessi solo 3 punti?
(E cosa renderebbe le cose molto più complicate, se potessi porre più ostacoli?)
Percorso liscio

Risposte:


9

Un approccio molto comune e generale è quello di dividere lo spazio del mondo in griglie e utilizzare algoritmi come A *.

Questo link mi ha aiutato a iniziare a comprendere e implementare l'algoritmo A *.

Modifica :

Un pensiero più semplice che mi viene in mente è ... una volta che hai il mondo in celle a griglia. Chiedi sempre al punto nero di seguire la distanza di Manhattan dal punto verde. Quindi, è possibile assegnare pesi a ciascuna cella. Gli ostacoli possono avere un peso elevato sulla cella della griglia e il free-to-move può avere (diciamo) 0 peso. Mentre ti sposti lungo la distanza di Manhattan, per ogni mossa, controlla se il peso della cella successiva non è superiore al peso della cella corrente. Se è più alto, controlla il peso della cella adiacente e poi vai avanti.

Spero che sia di aiuto


Questo articolo dell'algoritmo A * sembra essere quello che stavo cercando, ma sfortunatamente quello che ancora non so è come dividere il mio "mondo" in griglie: S
utente

Dipende davvero. Pensiero: dividi il tuo mondo in una griglia di 32 x 32 che rappresenterebbe quindi le posizioni in un array 2D. Ad esempio, nel tuo caso: il punto rosso è a 120, 120 pixel (o 120/32 x 120/32: 3,75 x 3,75) 3,75 x 3,75 rappresenta una posizione sulla griglia del mondo (o matrice 2D). Poiché le matrici sono indicizzate da numeri interi, ne vuoi solo una parte intera. Quindi, il punto rosso sarebbe 3 x 3. Spero che questo aiuti
brainydexter

18

I comportamenti di guida sono progettati praticamente per questo esatto set di problemi.

http://www.red3d.com/cwr/steer/

Fondamentalmente dovresti combinare il comportamento di evitamento degli ostacoli con probabilmente il comportamento di ricerca o perseguimento. Quella pagina ha un sacco di animazioni Java dei diversi comportamenti e di ciò che fanno. Esistono diverse implementazioni open source dei comportamenti di guida. Eccone uno.


I comportamenti di guida sono perfetti per questo.
dieci

2

Una cosa facile da provare è avere un punto invisibile che precede il punto nero ed esegua il percorso nella tua prima immagine. Il punto nero segue quindi il punto invisibile a una piccola distanza dietro.
Ho visto questo lavoro con buoni risultati, ma ovviamente potrebbe non soddisfare le tue esigenze.

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.