Macchine statali: oggetto statico contro controllo sequenziale: quali sono i pro / contro?


8

Non so molto sulla macchina a stati finiti nell'intelligenza artificiale o altri comportamenti di gioco nel gioco, tranne questo breve tutorial con un minatore: http://www.ai-junkie.com/architecture/state_driven/tut_state1.html che è orientato agli oggetti.

Non so davvero se questo tutorial descriva o meno il modello di stato, cosa ne pensi?

Non sto parlando di altre cose più aritmetico-oriented, come sterzo o la fisica o il percorso di accertamento o di collisioni, ma piuttosto di logiche di gioco,-driven stato AI, e le cose che comporta un sacco di stati simultanei e ifs e / o switches

Quali sono i pro / contro dell'utilizzo di un modello di stato o di un controllo sequenziale di una struttura a stato semplice come questa:

struct States
{
bool is_walking, is_running, holds_a_weapon, is_crouch;
int weapon_id, int id_team;
};

void HandleStates (States state)
{
//etc
}

2
Penso che potresti aver bisogno di formulare un po 'meglio la tua domanda, ma una rapida risposta sopra in modo che tu possa farlo è in generale lo stato rimuove i controlli If. passare (stato) {case blah} per creare una tabella di salto, o il mio modo personale preferito di fare le cose, puntare funzioni o delegati su uno stack o una coda se l'IA dovrebbe tornare a quello che stavano facendo prima o passare alla cosa successiva. ..
James,

Risposte:


10

Cercherò di rispondere al meglio possibile, ma ci sono alcune "buone pratiche" di cui non sono sicuro, ma cercherò di scomporle nel modo più pulito possibile.

FSM

In primo luogo, il tutorial di Miner è tratto dal Programma di programmazione AI per esempio di Mat Buckland (che ti consiglio di ottenere come introduzione all'IA). Usa un enum per ogni stato, NON una struttura. Con la struttura nel tuo esempio hai booleani come gli stati, quindi puoi averne un numero qualsiasi contemporaneamente. Ciò potrebbe comportare il comportamento desiderato, ma il più delle volte con FSM (macchine a stati finiti) porta a comportamenti indesiderati.

Per esempio:

enum
{
WANDER_AROUND,
ATTACK,
RUN_AWAY,
};

In secondo luogo, non è l'unico modo in cui descrive gli stati. Il modo in cui preferisco personalmente (a seconda della situazione) è creare una classe astratta chiamata State che abbia una funzione Enter (), Exit () e Update (). Quindi crea i miei stati come sottoclassi della classe State.

Come questa immagine (che si trova in realtà a pagina 2 di quel link): testo alternativo

Modello di stato

Secondo la mia opinione personale, il modello di stato è solo una parte della progettazione del software in cui il software ha un certo numero di stati. L' implementazione dipende dallo sviluppatore. Non credo che ci sia una differenza adeguata tra l'uso di una grande istruzione switch o la creazione di una macchina a stati completa per eseguire tutti i tuoi stati come ho già descritto sopra. Stanno essenzialmente facendo la stessa cosa. Quindi, a tale proposito, la risposta a una delle tue domande è sì, credo che la pagina descriva il modello di stato.

Pro e contro

Esistono vantaggi e svantaggi di qualsiasi metodo utilizzato per implementare una progettazione guidata dallo stato.

Utilizzo di un'istruzione If / Else o Switch

Professionisti:

  • Molto facile da aggiungere e controllare le condizioni degli stati
  • Può essere prototipato molto rapidamente

Contro:

  • Quando hai un sacco di stati, può diventare molto brutto, molto rapidamente.
  • Tenere traccia delle transizioni, degli effetti quando si entra / esce dallo stato o di qualcosa di specifico per lo stato è difficile

Utilizzo di una macchina a stati orientata agli oggetti

Professionisti:

  • Estensibile - l'unica cosa che devi fare è creare un nuovo stato che erediti la classe di stato astratta
  • Facilmente gestibile - Non devi preoccuparti di spaghetti che sembrano codice poiché ogni stato risiede nella propria classe. Puoi facilmente vedere le condizioni associate a quello stato senza preoccuparti degli altri stati.
  • Intuitivo: se stai lavorando a un progetto di gruppo con questo tipo di macchina a stati, sarà molto più facile per la persona che legge il tuo codice. Non dovranno leggere righe su righe di codice solo per raggiungere un certo stato ("Programma sempre come se il programmatore che mantiene il tuo codice sia uno psicopatico che sa dove vivi!" :))

Contro:

  • Leggera curva di apprendimento: questo progetto potrebbe richiedere del tempo per girare completamente la testa durante l'implementazione
  • Sinceramente non riesco più a pensarci, dato che preferisco così, ma se qualcuno desidera aggiungerlo, commentalo e lo aggiungerò.

Spero che risponda a tutte le tue domande. In effetti, ho appena aperto la mia copia di Programming Game AI per esempio e Mat menziona che la macchina a stati è conosciuta come "modello di progettazione dello stato". Personalmente, non sono d'accordo, ma a ciascuno il suo.

Spero che sia d'aiuto :)


1
+1 questo descrive essenzialmente come ho creato la mia macchina a stati. Sta funzionando bene.
Kyle C

Potresti sostenere che c'è un impatto sulle prestazioni con il modello "macchina a stati orientata agli oggetti" - per quanto leggero possa essere?
Noob Saibot,

@NoobSaibot Sì, ma potresti discuterne per qualsiasi cosa. L'if-if potrebbe soffrire di una cattiva previsione del ramo, il modello di stato come descritto sopra potrebbe soffrire della ricerca della tabella ambientale. Entrambi sono improbabili a meno che tu non abbia un sacco di stati. Quindi la vera risposta alla tua domanda è "dipende".
Ray Dey,
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.