AI imperfetto


19

Quindi sto iniziando a imparare Java e alcuni OpenGL mentre uso LWJGL. Per cominciare, sto scrivendo un clone di Atari Pong. Ho impostato correttamente la schermata di gioco, il rilevamento delle collisioni e tutto il gioco funziona per lo più, in realtà, se fosse un gioco a 2 giocatori sarei finito ormai, ma mentre sto programmando di farlo un gioco per giocatore singolo , Devo inventare una semplice IA per controllare il secondo giocatore.

Sapere dove colpirà la palla sembra abbastanza banale e creare un'intelligenza artificiale che colpisce sempre la palla sembra una cosa facile da fare, ma voglio che il gioco sia in grado di essere vinto, quindi non posso sempre fare in modo che l'IA colpisca il palla.

Quindi ecco la mia domanda, come dovrei codificarla per aggiungere imperfezioni di tipo umano all'intelligenza artificiale. Dovrei decidere a caso se l'intelligenza artificiale fallirà in un determinato punto? O c'è una cosa più intelligente (o forse solo ovvia) che mi manca qui?

Grazie mille.


5
Beh, generalmente fai che la mazza AI si muova solo di una certa velocità, quindi se la palla è ben posizionata dal giocatore l'IA non può raggiungerla ..

4
Comincerei limitando la velocità con cui l'IA può muovere la paletta, e / o costruendo un intervallo di tempo casuale (breve) prima che l'IA inizi a rispondere a un colpo.


4
@ byte56 Non lo definirei davvero un duplicato di quella domanda. Sembra l'esempio fornito qui blog.stackoverflow.com/2011/01/… in "Se hai intenzione di chiudere la domanda di un utente come duplicato, deve essere un vero duplicato". Quella domanda è una buona risorsa (e qualcuno potrebbe probabilmente usare quella domanda per ricavare una risposta da soli dato il contenuto lì), ma non risponde davvero ai dettagli di questa domanda, non credo.
Tetrad,

1
@Tetrad Penso che le risposte finiscano per essere molto simili, ma, hai ragione, le domande sono diverse. Penso che questa domanda sia una specie di versione più specifica della domanda collegata. Se l'OP avesse visto l'altro per primo, non sono sicuro che questa domanda sarebbe stata posta. Quando ho votato, ero indeciso, quindi ho entrambi votato a favore della domanda e delle risposte e ho votato come duplicato. Potrebbe andare in entrambi i modi per me.
MichaelHouse

Risposte:


20

La mia IA imperfetta preferita è brutalmente semplice, ma consente di fare un errore AI piuttosto piacevole.

Invisible Ball AI

Configurazione AI : quando la palla si riflette sulla tua paletta, sai dove si trova e quanto velocemente sta andando. Genera una palla invisibile in quel punto ma a una velocità maggiore. Si concluderà dove sta andando la palla visibile. Ad ogni frame, l'IA si sposta verso la posizione della palla invisibile. Ferma la palla invisibile quando raggiunge il lato dell'IA, quindi è dove l'IA dovrebbe muovere la sua paletta.

Risultati : l'IA sembra stia cercando di prevedere il percorso della palla. Supponi che il giocatore abbia riflesso la palla da un angolo ripido in modo che rimbalzi contro un muro. L'intelligenza artificiale rintraccerà la palla un po 'in basso e quindi - essendo più lenta della palla - non riuscirà a rintracciarla abbastanza velocemente. Hai ingannato l'IA e sembra abbastanza logico da un punto di vista umano. Puoi vedere il computer che prova a prevedere dove andrà la palla e poi - oh, è mancato, è stato troppo lento e hai vinto un punto.

Ciò è significativamente migliore dell'inserimento della casualità, poiché rende l'IA relativamente relativamente intelligente. Un degno avversario. Inoltre, consente all'IA di giocare secondo le stesse esatte regole dell'essere umano, il che sembra migliore per il giocatore e semplifica il tuo lavoro.

Impostazioni : puoi anche modificare la velocità della palla invisibile, poiché ciò determinerà quanto in anticipo l'IA pianificherà. Più veloce è la palla invisibile, più tempo la paddle dovrà muovere per bloccare e migliore sarà la mira del giocatore.


Tutte le risposte fornite hanno fornito informazioni davvero valide, ma siccome ho dovuto contrassegnarne una per essere la risposta giusta, ho scelto questa come mi piace molto il tuo approccio. Questo, combinato con alcune altre cose dette in altre risposte (come giocare con il tempo di reazione) potrebbe ottenere un'intelligenza artificiale simile all'uomo e con una difficoltà facilmente regolabile
Setzer22

Questo ha funzionato perfettamente per la mia configurazione perché ho angoli, velocità e accelerazione variabili basati su determinate mosse speciali, quindi la palla può potenzialmente essere ovunque. L'intelligenza artificiale stava diventando di proprietà, ma ora è molto meglio. Posso capire perché questo metodo non è il migliore per la velocità di blocco e gli angoli di 45 gradi, ma non è affatto il mio gioco.
jackrugile,

1
Mentre mi piace questo approccio, ho avuto problemi con la mia implementazione. Il problema è che, poiché la palla tracciante si muove più velocemente della palla che rappresenta, potrebbe perdere alcune collisioni che accadranno alla palla che rappresenta. Il motivo è, ovviamente, che la sfera tracciante si sposterà di una distanza maggiore tra i frame.
Wolfgang Schreurs,

Se si desidera una maggiore fedeltà, è possibile ricalcolare la posizione della sfera del tracciante due volte per fotogramma e dimezzare la velocità per ciascun calcolo.
DDR,

22

I giochi di Pong a cui ho giocato sembrano comportarsi nel modo seguente: la paletta controllata dall'intelligenza artificiale sa dove colpirà la palla, ma è limitata da quanto velocemente può raggiungere quella posizione. Quindi a volte manca. Penso che questo sia il modo più ovvio per farlo.


Questo. Non aiuta l'IA a sapere dove colpirà la palla se può muoversi, diciamo, 3px per frame e deve spostarsi dall'alto verso il basso.
KeithS

14

Quando ho creato un clone quasi pacman quasi fantastico sulla mia TI83? calcolatrice, il problema più grande che ho incontrato è stato che i "fantasmi" erano troppo veloci. Ho dovuto rallentarli in qualche modo. Quindi, ho inserito un grande vecchio peccato (cos (tan (coordinata x))) lì dentro. Livelli più semplici farebbero quel calcolo alcune volte e livelli più difficili farebbero solo una delle operazioni.

Il punto è, TEMPO DI REAZIONE. Cerca cos'è un tipico tempo di reazione umana e aggiungi 10 ms su di esso. Usalo come punto di partenza. Man mano che i livelli diventano più difficili, rimuovi il tempo dal tempo di reazione ... che può essere semplice Thread.sleep(time);per l'IA. Attendere quel periodo di tempo prima che l'IA inizi a muoversi.

Puoi anche controllare la velocità con cui si muove la paletta o, se vuoi davvero complicarti, determinare dove si baserà la palla su vari gradi di informazione ... dì solo 2 pixel anziché un vettore. Aggiungi modificatori angolari alle pareti per aggiungere un grado di casualità, costringendo l'IA a ricalcolare.


2
Potresti spiegare perché esattamente hai usato sin(cos(tan(x)))?
nullpotent

5
perché ero giovane, stupido e su una TI83, sin (cos (tan (x))) ha creato una buona unità di ritardo nell'intelligenza artificiale. Anche perché, per quanto ne so, la calcolatrice non aveva un comando di attesa che potesse usare i millisecondi. Forse un po 'di chiarezza: non ho usato l'assembly o il micro script o qualsiasi linguaggio tu possa compilare per eseguire su quelle cose. Ho usato il codice di programmazione nel firmware (il pulsante prgm). Avevo MAXIMUM 8 righe di codice sullo schermo in qualsiasi momento. Non riuscivo a ricordare nulla di più complicato per un periodo di ritardo.
Russell Uhl,

2
Ho imparato a programmare il codice nel firmware del TI83. Quindi ho dovuto imparare nuovamente la programmazione strutturata in C ++. Direi che la TI83 mi ha insegnato che cos'è il codice stringa spaghetti e perché è cattivo. Da allora non ho più usato un'istruzione goto. Buoni tempi però.
ContextSwitch

2
oh buon dio, i goto. Ogni tanto rivedo il codice .... e mi arrendo rapidamente. Non ho idea di come sono riuscito a programmare questa cosa per un periodo di settimane durante le mie lezioni di matematica.
Russell Uhl,

1
Non è necessario essere difensivi per il ritardo del trigger. La matematica a virgola mobile in un ciclo era un modo comune per fare una pausa nei programmi scritti diversi decenni fa e le prestazioni / capacità dei calcolatori sono in linea con un computer dei primi anni '80.
Dan Neely,

6

Se semplicemente rallenti la paletta, ogni volta che colpisci la palla con un angolo acuto (cioè muovendo su e giù molto invece che dritto dall'altra parte), il computer mancherebbe quasi sempre perché la palla si sta muovendo su / giù più veloce di quanto la pagaia possa compensare.

Invece, quello che vorrei fare è giocare con la velocità della paletta e il punto in cui l'IA reagisce. Per esempio:

  • quando l'utente colpisce la palla
    • l'IA può reagire immediatamente e andare dove sarà la palla. Se è abbastanza veloce, arriverà in tempo
  • quando la palla attraversa il centro del campo
    • l'IA deve attendere fino a quando attraversa il centro del campo prima di reagire

Un'altra cosa da cambiare è il modo in cui l'IA reagisce. Hai evidenziato una strategia in cui la paletta si sposta sempre nella posizione in cui si troverà la palla. Una persona non può sempre farlo. È più probabile che seguano la palla su e giù, non sapendo dove sarà esattamente la palla quando arriva a loro a causa di tutti i rimbalzi.

Quindi, un più umano metodo di reazione è quello di muoversi sempre verso la palla. Ad esempio, se la palla si sta muovendo verso l'alto, la paletta si sposta verso l'alto. Se la paletta è abbastanza veloce, può reagire ai rimbalzi dall'alto e dal basso. Se la sua paletta non è abbastanza veloce, allora compenserà eccessivamente spostandosi verso l'alto quando la palla si alza, ma poi quando rimbalza, la paletta potrebbe non essere in grado di muoversi abbastanza velocemente.

Infine, puoi giocare anche con le dimensioni della paletta per aumentare / diminuire la difficoltà.


2

Un fattore da considerare è la casualità: i giocatori umani hanno sempre un certo grado di variazione nel loro gioco, quindi se vuoi che la tua IA sembri umana, allora vorrai anche avere una variazione nel loro gioco.

È possibile impostare intervalli per:

  • Tempo di reazione (con quale velocità l'IA inizia a muoversi)
  • Velocità (con quale velocità l'IA sposta la paletta)
  • Precisione (quanto vicino l'IA arriverà a dove effettivamente vuole spostare la loro paletta, dando la possibilità di effettuare ilhohohoot o il superamento dove vogliono essere)

Quindi, ad ogni colpo dell'avversario, l'IA può scegliere un valore all'interno di quei range e prendere le sue decisioni (e movimenti) in base a quello. Per i più facili avversari dell'IA, puoi rendere quelle gamme piuttosto povere, ma hanno anche ampie gamme per dare all'IA alcuni "colpi fortunati". Per gli avversari più difficili, puoi stringere quelle gamme e metterle tutte nella gamma "buona".


2

Sto per suggerire una soluzione più generale che non è specifica per il solo pong. Credo che questo possa essere applicato a qualsiasi gioco, non solo al pong. Vuoi un comportamento umano, vero? In modo che un essere umano possa sentirsi come se interpretasse un essere umano ... e quindi per estensione speriamo di vincere. Allora cosa fai?

Osserva un essere umano! Come può un giocatore perdere a pong? Bene, se guardiamo due giocatori di pong è abbastanza ovvio. Di solito, la perdita è dovuta al fatto che la palla è semplicemente troppo veloce e il tempo di reazione dei giocatori è stato ritardato. Sono due parametri, uno dei quali è regolabile. L'altra è la capacità dei giocatori di premere la giusta direzione. Quindi hai una frequenza di errore e una frequenza di reazione - entrambi possono essere sintonizzati a seconda della difficoltà.

Un'intelligenza artificiale facile avrebbe un maggiore ritardo di input e una maggiore tendenza a commettere errori casuali - laddove un'intelligenza artificiale più difficile sarebbe sintonizzata per rendere questi parametri orientati a essere difficili.

Questo può essere applicato a quasi tutti i giochi, anche a quelli come tic tac toe o modelli ancora più complessi. Questo approccio si suddivide in scenari più complicati, ma è abbastanza sufficiente quando i giochi in cui il numero di parametri e ambito è limitato.


1

Ecco un elenco di alcune opzioni, alcune delle quali sono già state trattate:

  • Rendi i giocatori più intelligenti puntando la palla in modo che sia più difficile per il giocatore raggiungere con molti rimbalzi e faccia il contrario per avversari facili.
  • Un giocatore intelligente si sposterà la sua paletta verso il centro mentre la palla è sulla sua strada verso l'avversario e non sanno dove tornerà.
  • Prima del rimbalzo finale è più difficile per un essere umano prevedere dove finirà la palla. Fai in modo che l'IA abbia un'imprecisione simile.
  • Limita la velocità della paletta in modo che sia più lenta della palla. Deve essere inferiore alla metà della velocità verticale per mancare con un gioco perfetto.
  • Aumenta la velocità della palla in base a difficoltà, durata della partita, ecc.
  • Gli umani non reagiscono istantaneamente. Nemmeno i giocatori dell'IA dovrebbero farlo.
  • Dai all'IA una possibilità casuale di sbagliare e perdere la palla.

0

Ho fatto un piccolo clone Pong (in LUA).

La mia IA è molto semplice ma non è poi così male, imho.

Controllo solo la posizione y della palla e se più in basso muovo la paletta verso il basso, se più in alto muovo la paletta verso l'alto.

Quindi, per ottimizzare la difficoltà, aumento o diminuisco la distanza dalla palla da cui inizia a muoversi la paletta del computer.

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.