2011-11-15 13 views
8

Attualmente sto facendo un gioco di pacman in java. Ho una domanda sui fantasmi però.Pacman Ghost AI

Capisco che i fantasmi non hanno tutti lo stesso stile di attacco. Prima voglio lavorare sulle basi per ottenere il fantasma di andare dopo il pacman e non preoccuparti delle differenze ancora.

La mia domanda a voi persone intelligenti là fuori è quello che sarebbe il modo migliore per far sì che i fantasmi inseguano il pacman ma a volte a caso deviano percorsi. Attualmente sto usando un array 2D 21 x 21 per dire dove sono i muri e così stavo pensando di fare di più e cercare la posizione attuale della griglia di pacman. (per esempio vai a 10,14) Ovviamente evitando di attraversare muri come Pacman. Mi chiedo come potrei farcela e anche i fantasmi a volte si fermano e vanno in un'altra direzione o qualcosa in modo che non sia sempre un inseguimento costante e Pacman ha la possibilità di scappare. Forse alcuni di voi hanno programmato un gioco di pacman o semplicemente conoscono un buon modo per farlo. Qualsiasi aiuto sarebbe molto apprezzato.

(Si prega di notare che sono attualmente in corso di grado 11 Computer Science e metà del primo semestre mai di java imparato.)

+0

Che cos'è il grado 11, per quelli di noi che resistono all'assimilazione da parte dell'anglosassone? –

+0

@larsmans È un corso di terzo anno della scuola superiore, anche se sono al mio secondo anno di scuola superiore, non vedevo l'ora di seguire il corso. – ComputerLocus

+0

Ovviamente avrei potuto vederlo sul tuo profilo utente :) –

risposta

6

Se si desidera che i fantasmi non si comportino tutti allo stesso modo, ogni volta che incontrano un'intersezione, prendere la decisione un mix casuale di qualche ragionevole inseguimento predefinito (ad esempio continuare il percorso con la distanza più breve da Pacman - Utilizzare Dijkstra's algorithm su tutti i successori per scegliere il migliore) e una scelta casuale.

+0

Quindi il tuo modo di dire fa sì che scelgano un turno casuale dall'intersezione, ma è più probabile che andranno nella direzione in cui sta andando Pacman? – ComputerLocus

+1

@Fogest esattamente. I valori che impediscono ai fantasmi di aggregarsi insieme ma mantengono il gioco interessante dovrebbero essere determinati da esperimenti (a seconda della forma del labirinto), ma suppongo che il 50% di scelta casuale - il 50% del percorso più breve dia risultati accettabili. –

+0

Ok, mi piace l'idea e molto probabilmente userò qualcosa sulla falsariga di questa o della risposta di @larsmans. – ComputerLocus

4

ho trovato molto utile questo articolo: Understanding Pac-Man Ghost Behavior, come spiega proprio quello che serve .

+0

Sì. So che ogni fantasma ha il proprio comportamento ma non ci aspettiamo affatto nel corso in cui mi trovo per programmare un gioco di tale complessità. Voglio solo aggiungere prima un sistema di inseguimento di base, non ancora questo avanzato di metodi. – ComputerLocus

4

Ecco una possibilità: per tutti i passaggi che il fantasma può eseguire, calcolare se tale passaggio lo avvicini a Pacman. Questo può essere fatto con lo Manhattan distance, che in una griglia 2d è solo la distanza x + la distanza . Quindi scegli un passaggio a caso, con una probabilità più elevata assegnata a quei passaggi che in realtà lo avvicinano.

Se si dispone di una matrice steps con i primi n_closing_in passi che rappresentano i passi che porteranno il fantasma più vicino a Pacman, allora è possibile assegnare coloro una probabilità totale di prob_closing_in con

double total_probility = 1.; 
for (int i=0; i<n_closing_in; i++) { 
    step_prob[i] = prob_closing_in/n_closing_in; 
    total_probability -= prob_closing_in/n_closing_in; 
} 

Poi simile distribuire ciò che resta in total_probability sui passi che porteranno il fantasma più lontano da Pacman.

Step random_step(Step[] possible_steps, double[] step_prob) { 
    double r = Math.random(); 

    int i; 
    for (i=0; i<possible_steps.length(); i++) { 
     if (r < step_prob[i]) 
      break; 
     r -= step_prob[i]; 
    } 
    return possible_steps[i]; 
} 

Se il labirinto non è troppo complicato e la probabilità di chiusura è >.5, i fantasmi sembreranno inseguire Pacman, ma in modo casuale.

Aumentare prob_closing_in verso 1. renderà il gioco più difficile.

(Tutto il codice di cui sopra non è testato e può contenere bug. Io non sono troppo bravo a Java.)

+0

Beh mi hai un po 'perso. Non ho mai imparato a conoscere Steps. – ComputerLocus

+0

@Fogest: stavo pensando sulla falsariga di enum Step {LEFT, RIGHT, UP, DOWN} '. –

+0

Ancora non capisco ... – ComputerLocus

1

Per il mio corso AI livello di college, ho fatto qualche lavoro con una versione precedente del fantasma Pacman Quadro di intelligenza artificiale Sembra che la versione attuale possa essere trovata qui http://www.pacman-vs-ghosts.net/software (Now DEAD). In questo svilupperesti i tuoi agenti Ghost per provare a catturare un agente o un Pacman controllato dall'utente.

Questo è stato molto utile per giocare con diverse tecniche di intelligenza artificiale.

Più per la tua domanda, i livelli in quella struttura sono effettivamente costruiti da un grafico e non da un array 2d. Potresti dare un'occhiata al codice per vedere come lo fanno.

Il collegamento originale è morto e finora non è stato possibile trovare uno specchio ufficiale. Tuttavia, il seguito sarà probabilmente essere di aiuto:

Understanding Pac Man Ghost Behavior Ms Pac Man Vs Ghost AI (GitHub) PacMan_v6.2 (GitHub)

+0

Darà un'occhiata ma considero il mio livello di abilità. – ComputerLocus

+0

sfida te stesso! ;-) – Casey

+0

Questo link è obsoleto. – jumpnett

0

più facili le implementazioni di una tale intelligenza artificiale sarebbe quella di utilizzare un algoritmo di ricerca grafico ingenuo. BFS sarebbe semplice e funzionerebbe. Tuttavia, si vorrebbe implementare un'euristica per ottimizzare al meglio il runtime, quindi una semplice distanza da Manhattan a Ghost-Agent sarebbe sufficiente.

Riassunto: BFS con euristica distanza Manhattan.

Se vuoi diventare più fanatico e rendere i tuoi fantasmi ancora più efficienti nella caccia, puoi implementare uno stato euristico di gioco (basato sulla distanza dal fantasma a Pac-man e quanti punti ha mangiato Pac-man finora , ad esempio) da utilizzare per quando il fantasma deve scegliere quale prossima mossa prendere. In questo caso è possibile utilizzare pruning techniques per abbreviare il runtime.