Ich werde versuchen, dies so gut wie möglich zu beantworten, aber es gibt bestimmte "Best Practices", bei denen ich mir nicht sicher bin, aber ich werde versuchen, sie so sauber wie möglich aufzuschlüsseln.
FSMs
Erstens stammt das Miner-Tutorial aus dem Programmierspiel AI by Example von Mat Buckland (das ich als Einführung in AI empfehlen sollte). Er verwendet für jeden Zustand eine Aufzählung, KEINE Struktur. Mit der Struktur in Ihrem Beispiel haben Sie Boolesche Werte als Status, sodass Sie eine beliebige Anzahl davon gleichzeitig aktivieren können. Dies kann zu einem gewünschten Verhalten führen, führt jedoch bei FSMs (Finite State Machines) häufig zu unerwünschtem Verhalten.
Zum Beispiel:
enum
{
WANDER_AROUND,
ATTACK,
RUN_AWAY,
};
Zweitens beschreibt er Staaten nicht nur so. Ich persönlich bevorzuge (je nach Situation) die Erstellung einer abstrakten Klasse namens State mit den Funktionen Enter (), Exit () und Update (). Dann erstellen Sie meine Zustände als Unterklassen der Zustandsklasse.
Wie dieses Bild (tatsächlich auf Seite 2 dieses Links zu finden):

Zustandsmuster
Meiner persönlichen Meinung nach ist das Zustandsmuster nur ein Teil des Software-Designs, bei dem die Software eine Reihe von Zuständen aufweist. Die Implementierung liegt beim Entwickler. Ich glaube nicht, dass es einen richtigen Unterschied zwischen der Verwendung einer großen switch-Anweisung oder der Erstellung einer vollständigen Zustandsmaschine gibt, um alle Ihre Zustände auszuführen, wie ich oben beschrieben habe. Sie machen im Wesentlichen das Gleiche. In dieser Hinsicht lautet die Antwort auf eine Ihrer Fragen Ja. Ich glaube, diese Seite beschreibt das Zustandsmuster.
Für und Wider
Jede Methode, mit der Sie ein zustandsgesteuertes Design implementieren, hat Vor- und Nachteile.
Verwenden einer If / Else- oder Switch-Anweisung
Vorteile:
- Sehr einfach, Zustände von Zuständen hinzuzufügen und zu überprüfen
- Kann sehr schnell prototypisiert werden
Nachteile:
- Wenn Sie eine Menge Zustände haben, kann es sehr hässlich werden, sehr schnell.
- Das Verfolgen von Übergängen, Effekten beim Ein- / Verlassen des Zustands oder von spezifischen Zuständen ist schwierig
Verwendung einer objektorientierten Zustandsmaschine
Vorteile:
- Sehr erweiterbar - Sie müssen lediglich einen neuen Status erstellen, der die abstrakte Statusklasse erbt
- Einfach zu warten - Sie müssen sich keine Gedanken über Spaghetti-Code machen, da sich jeder Status in seiner eigenen Klasse befindet. Sie können die mit diesem Status verbundenen Bedingungen leicht anzeigen, ohne sich um die anderen Zustände kümmern zu müssen.
- Intuitiv - Wenn Sie an einem Teamprojekt mit dieser Art von Zustandsmaschine arbeiten, ist dies für die Person, die Ihren Code liest, viel einfacher. Sie müssen nicht Code für Code durchlesen, um zu einem bestimmten Zustand zu gelangen ("Programmieren Sie immer so, als ob der Programmierer, der Ihren Code verwaltet, ein Psychopath ist, der weiß, wo Sie leben!" :))
Nachteile:
- Leichte Lernkurve - Es kann eine Weile dauern, bis dieses Design Ihren Kopf bei der Implementierung vollständig rund macht
- Ich kann ehrlich gesagt nicht mehr daran denken, da ich diesen Weg bevorzuge, aber wenn jemand etwas hinzufügen möchte, kommentiere einfach und ich werde sie hinzufügen.
Ich hoffe das beantwortet alle deine Fragen. Tatsächlich habe ich gerade meine Kopie von Programming Game AI by Example geöffnet und Mat erwähnt, dass die Zustandsmaschine als "State Design Pattern" bekannt ist. Persönlich bin ich anderer Meinung, aber jedem sein eigenes.
Ich hoffe es hilft :)