Trataré de responder esto lo mejor que pueda, pero hay ciertas "mejores prácticas" de las que no estoy seguro, pero trataré de analizarlo de la manera más limpia posible.
FSM
En primer lugar, el tutorial de Miner es de Programming Game AI by Example de Mat Buckland (que recomiendo que consigas como introducción a AI). Él usa una enumeración para cada estado, NO una estructura. Con la estructura en su ejemplo, tiene booleanos como estados, por lo que podría tener cualquier número de estos al mismo tiempo. Esto puede conducir al comportamiento que desea, pero la mayoría de las veces con FSM (máquinas de estado finito) conduce a un comportamiento indeseable.
Por ejemplo:
enum
{
WANDER_AROUND,
ATTACK,
RUN_AWAY,
};
En segundo lugar, esa no es la única forma en que describe los estados. La forma en que personalmente prefiero (dependiendo de la situación) es crear una clase abstracta llamada State que tenga las funciones Enter (), Exit () y Update (). Luego crea mis estados como subclases de la clase State.
Como esta imagen (que se encuentra en la página 2 de ese enlace en realidad):
Patrón de estado
En mi opinión personal, el patrón de estado es solo una parte del diseño del software donde el software tiene varios estados. La implementación depende del desarrollador. No creo que haya una diferencia adecuada entre usar una declaración de cambio grande o crear una máquina de estado completa para ejecutar todos sus estados como he descrito anteriormente. Básicamente están haciendo lo mismo. En ese sentido, la respuesta a una de sus preguntas es sí, creo que esa página describe el patrón de estado.
Pros contras
Hay ventajas y desventajas de cualquier método que use para implementar un diseño basado en el estado.
Uso de una declaración If / Else o Switch
Pros:
- Muy fácil de agregar y verificar las condiciones de los estados
- Puede ser prototipo muy rápido
Contras:
- Cuando tienes una gran cantidad de estados, puede volverse muy feo, muy rápidamente.
- Hacer un seguimiento de las transiciones, los efectos cuando el estado ingresa / sale o cualquier cosa específica del estado es difícil
Usando una máquina de estado orientada a objetos
Pros:
- Altamente extensible: lo único que debe hacer es crear un nuevo estado que herede la clase de estado abstracto
- Fácilmente mantenible: no tiene que preocuparse por el código de aspecto de espagueti ya que cada estado reside en su propia clase. Puede ver fácilmente las condiciones asociadas con ese estado sin preocuparse por los otros estados.
- Intuitivo: si está trabajando en un proyecto de equipo con este tipo de máquina de estados, será mucho más fácil para la persona que lee su código. No tendrán que leer líneas sobre líneas de código solo para llegar a un cierto estado ("Siempre programe como si el programador que mantiene su código sea un psicópata que sabe dónde vive!" :))
Contras:
- Ligera curva de aprendizaje: este diseño puede demorar un poco en comprender completamente al implementar
- Sinceramente, no puedo pensar en nada más, ya que prefiero de esta manera, pero si alguien desea agregarle algo, solo comente y lo agregaré.
Espero que conteste todas sus preguntas. De hecho, acabo de abrir mi copia de Programming Game AI con Example y Mat menciona que la máquina de estado se conoce como el "patrón de diseño de estado". Personalmente, no estoy de acuerdo, pero a cada uno lo suyo.
Espero eso ayude :)