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):
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 :)