Aiuta con l'IA del gioco di strategia


8

Sto sviluppando un'IA di gioco di strategia (pensate a: Final Fantasy Tactics) e non riesco a trovare il design dell'IA. Il mio problema principale è determinare qual è la cosa ottimale da fare.

Prima di tutto lasciami descrivere la priorità di quale azione vorrei che l'AI intraprendesse:

  1. Uccidi l'unità del giocatore più vicino

  2. Soddisfa la direttiva principale (uccidi tutte le unità del giocatore, uccidi l'unità bersaglio, sopravvivi per x turni)

  3. Guarisci unità alleata / buffer di lancio

Ora l'IA può a sua volta fare quanto segue:

  • Sposta -> {Attacco / Abilità / Oggetto} (attacco o abilità o oggetto)

  • {Attacco / Abilità / Oggetto} -> Sposta

  • Avvicinarsi (se i bersagli non si trovano nel raggio)

  • {Attacco / Abilità / Oggetto} (se la mossa non è disponibile)

Appunti

Le abilità hanno vari intervalli / effetti / costi / effetti. Ogni unità ai ha forse 5-10 abilità tra cui scegliere. L'intelligenza artificiale darà la priorità all'uccisione rispetto alla sicurezza, a meno che la sua direttiva non sopravviva per x turni. Inoltre non importa molto del costo dell'abilità. Mentre un giocatore potrebbe voler salvare un grande incantesimo per dopo, l'IA lo utilizzerà molto probabilmente al più presto.

Il movimento è su una griglia (esadecimale)

numero di unità del giocatore: 3-6

numero di unità ai: 3-7 o più. Probabilmente max 10.

AI e giocatore a turno controllano UNA unità, invece di tutti allo stesso tempo.

La piattaforma è Android (se il programma non risponde dopo un po 'di tempo, ci sarà un popup che dice Forza Esci o Aspetta - che sembra davvero male!).

Ora arrivano le domande:

  • La migliore abilità da usare sarebbe ovviamente quella che colpisce il maggior numero di bersagli per il maggior danno. Ma poiché ogni abilità ha range diversi, non saprò se sono nel range senza esplorare ogni possibile posto in cui posso spostarmi.

  • Una soluzione sarebbe quella di passare attraverso ogni possibile posizione in cui spostarsi, determinare l'attacco ottimale in quella posizione, il che mi dà un elenco di mosse ottimali per ogni posizione. Quindi scegli l' ottimale fuori dall'elenco ed eseguilo. Ma questo richiederà molto tempo CPU. C'è una soluzione migliore?

  • La mia idea attuale è quella di avvicinarmi il più vicino possibile al gruppo di persone più vicino e più grande e determinare l'attacco / abilità ottimale da lì. Penso che questo sarebbe molto meno lavoro per la CPU e consentirebbe comunque attacchi ad ampio raggio. È subottimale, ma l'IA sembrerà comunque "intelligente".

Altre note / domande:

  • Sto pensando troppo / complicando troppo? Soluzione migliore?Sono aperto a tutti i tipi di suggerimenti
  • Ho dato un'occhiata alla domanda sul lancio degli incantesimi , ma non tiene conto del movimento - quindi forse usa quell'algo per ogni possibile posizione di mossa? La risposta principale menzionava che non era eccezionale per le aree di effetto e i combattimenti di gruppo, quindi forse è necessario un ulteriore aggiustamento?
  • Per favore , se menzioni un grafico / albero, fammi sapere sostanzialmente come usarlo. Ad esempio Nodo significa abilità, il livello corrisponde al danno, quindi cerca il nodo più profondo.

Risposte:


8

Esistono molte applicazioni che è possibile utilizzare per questo tipo di IA. Personalmente, una delle tecniche più ovvie che potresti utilizzare è una funzione di valutazione della posizione. Killzone ha utilizzato questa tecnica ed è descritta nel seguente documento:

http://www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf

In realtà, potresti probabilmente usare molto di quel documento poiché descrive la rappresentazione del mondo, i dati della linea di vista, le tabelle di ricerca, ecc. E in pratica hai già un grafico con la tua griglia esadecimale (devi solo aggiungere nodi vicini, che in questo caso sarebbero gli esagoni vicini a un singolo esagono).

Un'altra cosa da esaminare (al momento è piuttosto impressionante, ma leggermente più avanzata) sono i pianificatori. Non ho letto molto su Hierarchical Task Networks, te lo lascio. Un pianificatore che potrebbe aiutare è GOAP (Goal Oriented Action Planning)

Questo link contiene molte informazioni su GOAP: http://web.media.mit.edu/~jorkin/goap.html

Qualcosa che ho appena pensato riguardo al tuo obiettivo "Sopravvivi per X numero di turni" è l'uso di una mappa di influenza. Una mappa di influenza è solo una rappresentazione molto semplice per il tuo mondo in cui ogni nodo (esagono) ha un singolo valore associato (chiamato influenza).

L'influenza può essere calcolata in diversi modi, ma un esempio per il tuo caso potrebbe essere quello di fare in modo che i giocatori generino +10 di influenza sull'esagono su cui sono posizionati e +1 di influenza sull'esagono che è designato come il raggio massimo del giocatore.

Quindi, ad esempio, se hai un gruppo di giocatori raggruppati insieme, l'influenza che li circonda sarebbe relativamente elevata. Ciò potrebbe essere interpretato dall'IA come una minaccia alla sua vita e si allontana dai punti di maggiore influenza.

Queste sono solo alcune tecniche che potresti usare, ma ce ne sono molte altre. Se vuoi qualcosa di semplice, usa qualcosa come i FSM gerarchici (praticamente FSM con ogni stato contenente un altro FSM con un livello di dettaglio più elevato). Se vuoi qualcosa di complesso ma funzionale e pratico usa GOAP e influenza le mappe. A dire il vero non importa perché il PUNTO PRINCIPALE è quello di rendere divertente l'IA e per farlo è necessario implementare una sorta di "stupidità artificiale". Nessuno vorrà giocare a un'intelligenza artificiale infinitamente più intelligente di loro, indipendentemente da quanti sforzi ci metti. Non sto dicendo questo per sembrare duro, lo sto dicendo perché è importante che l'IA commetta errori, così come fanno le loro controparti umane!

In bocca al lupo! :)


1
Grazie per le risorse Li ho già visti collegati nel sito prima. Dovrò leggerlo più in profondità ora per vedere come posso applicarlo al mio gioco. Ricordo di aver letto l'idea della mappa dell'influenza da qualche parte qui intorno, e quell'idea di base è ciò che stavo usando per la mia idea "attuale".
f20k,

5

Nel corso degli anni ho scritto 3 AI di gioco, ognuno dei quali ha giocato un gioco rispettabile.

Due dei casi avevano opzioni limitate per turno e quindi ho esplorato tutte le possibilità e valutato le posizioni risultanti - ho modificato la profondità che ho cercato in base alla difficoltà e non ci sono voluti molti strati per fare un avversario abbastanza rispettabile. Potrei abbassare un paio di strati e avere ancora una risposta in un secondo o due e questo era su alcuni processori piuttosto antichi. (Tutti questi erano prima che Windows fosse sulla scena.) La qualità dell'analisi della posizione è MOLTO importante quando si utilizza questo approccio.

Il terzo caso non ha permesso un'analisi del genere in quanto il numero di mosse possibili per turno potrebbe facilmente superare le particelle nell'universo. Era una situazione simile a quella del Rischio - territorio con un numero di eserciti su di esso, ma si poteva fare un numero qualsiasi di mosse per turno, il fattore chiave delle mosse richiedeva tempo. Una provincia della porta accanto generalmente prendeva 1 turno, una dall'altra parte della mappa poteva prendere 9.

Ho usato un approccio completamente diverso qui. Ho deciso che la percentuale delle forze da assegnare alla difesa e quelle assegnate in base al valore del territorio e alla stima della minaccia nemica (Mentre potevi vedere quali forze si muovevano il tuo avversario, non potevi vedere dove stavano andando - presumeva che il l'essere umano avrebbe concentrato le sue forze da qualche parte e ha pensato che fosse molto più probabile che si trovassero dove potevano arrivare tutti in una volta piuttosto che frammentariamente.) Tutto ciò che non era necessario per la difesa divenne disponibile per l'attacco. Ho esaminato ogni possibile obiettivo e ho calcolato cosa ci sarebbe voluto per avere una buona possibilità di prenderlo rapidamente (una battaglia prolungata avrebbe praticamente distrutto tutta la sua produzione) e generato una serie di ordini di attacco per questo. Il valore dell'ordine era il valore della provincia, il costo era il numero di eserciti / turni impegnati nell'attacco. Scegli il valore più alto ed esegui gli ordini, ripeti fino a quando le forze disponibili non potranno prendere nulla. Il tempo di esecuzione è stato banale.

Spero di averti dato alcune idee qui.


1
Hmm, quindi quello che posso capire dal primo paragrafo: se prendi un albero decisionale davvero ben ponderato, puoi creare un AI decente in pochi strati e aumentare la "intelligenza" a costo del tempo scendendo un altro livello (di difficoltà). Penso che lo proverò. Inoltre, mi piace la tua idea di inviare comandi in base al valore di una posizione.
f20k,

4

La tua nota sull'uscita / attesa mi suggerisce che stai facendo tutto il lavoro di elaborazione sul thread principale dell'applicazione. Potresti, supponendo che ci sia sufficiente supporto per i thread nell'SDK di Android (che presumo ci debba essere), scaricare la parte "pensante" della tua intelligenza artificiale su un thread di lavoro mentre la discussione principale fa apparire un'intelligenza artificiale in gioco "sta considerando. .. "Interfaccia utente ma altrimenti viene visualizzato normalmente.

Naturalmente ci sono buoni motivi per non voler farlo, come non volere che l'IA impieghi così tanto tempo perché il giocatore si annoierà.

Per quanto riguarda la tua vera domanda, mentre la tua "idea attuale" è praticabile, è molto semplice. È comunque un buon punto di partenza. È un sistema in cui l'IA è focalizzata esclusivamente sui risultati, cercando di massimizzare un valore (danno). Altre opzioni includono un approccio focalizzato sul bersaglio, in cui si sceglie un bersaglio dalla squadra avversaria (in modo casuale, uno con il maggior numero di PS, una sua combinazione, eccetera) e si sposta su quel bersaglio, cercando di danneggiarlo.

Una cosa che potresti prendere in considerazione è dare ad ogni abilità una stat di 'potenza' o 'efficacia' che è nascosta al giocatore e viene utilizzata solo internamente dalla tua IA. Determinate voi stessi i valori di questa statistica, in base alla vostra conoscenza delle abilità come programmatore del gioco.

La tua IA selezionerebbe quindi la loro abilità con il punteggio più alto e proverà a usarla, se non può per qualsiasi motivo, scegli quella successiva, eccetera. Se costruito in modo sufficientemente generico, potresti iniziare a legare insieme questi due sistemi, in modo che una volta stabilito un bersaglio hai euristiche per i migliori tipi di attacchi su quel bersaglio (ad esempio, soppesare un attacco che infligge danno da MP più efficace se il bersaglio ha un alto MP).


1
Per i punti che hai citato: hai ragione sull'uso di quel thread. Ho pensato a un thread di supporto per i calcoli dell'IA ma poiché l'utente sposta la propria unità, getterà via i calcoli. Sì, è una buona idea. Aggiungerò sicuramente un'euristica in modo che l'IA scelga più probabilmente un'abilità rispetto all'altra - consente anche un'IA 'a tema' che fa solo determinate abilità.
f20k,
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.