Herramientas de usuario

Herramientas del sitio


public:vj1231:fsm:start

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
public:vj1231:fsm:start [2026/10/06 11:40] – [¿Cómo se modela?] mperezpublic:vj1231:fsm:start [2026/10/13 16:42] (actual) – [Componentes de la FSM] mperez
Línea 1: Línea 1:
-====== Máquinas de estado finitos ======+====== Máquinas de Estados Finitos ======
  
 Una Máquinas de estado finitos (FSM, por sus siglas en inglés) es un modelo matemático compuesto por:  Una Máquinas de estado finitos (FSM, por sus siglas en inglés) es un modelo matemático compuesto por: 
Línea 13: Línea 13:
 Las FSM pueden implementarse utilizando simples estructuras condicionales if-then-else (o switch/case) es lo que se conoce como  "FSM implícita". Este tipo de FSM funcionan para casos simples, pero no escala bien y puede volverse difícil de mantener, depurar o extender.  Las FSM pueden implementarse utilizando simples estructuras condicionales if-then-else (o switch/case) es lo que se conoce como  "FSM implícita". Este tipo de FSM funcionan para casos simples, pero no escala bien y puede volverse difícil de mantener, depurar o extender. 
  
-*   **Inconvenientes:**+Los principales inconvenientes que plantea este enfoque son: 
     *   **Spaghetti code:** A partir de 5 o 6 estados, la función se vuelve ilegible.     *   **Spaghetti code:** A partir de 5 o 6 estados, la función se vuelve ilegible.
     *   **Violación del principio Abierto/Cerrado:** Añadir un estado nuevo o modificar una transición obliga a tocar y recompilar la función central, rompiendo fácilmente el código existente.     *   **Violación del principio Abierto/Cerrado:** Añadir un estado nuevo o modificar una transición obliga a tocar y recompilar la función central, rompiendo fácilmente el código existente.
Línea 19: Línea 20:
  
  
-Existen otras formas más robustas, modulares y limpias de implementar las FSM, uno de las técnicas más usadas es la que utiliza el modelo orientado a objetos donde cada estado es una clase, y las transiciones se manejan dentro de esas clases. +Existen otras formas más robustas, modulares y limpias de implementar las FSM, uno de las técnicas más usadas es la que utiliza el **enfoque orientado a objetos** donde cada estado es una clase, y las transiciones se manejan dentro de esas clases. 
  
-Las ventajas de este modelo es que cada estado encapsula su lógica lo que lo hace fácil de extender ya que  añadir un nuevo estado solo requiere una nueva clase y vita grandes bloques de if/else que hacen el código ilegible.+Las ventajas de este modelo es que cada estado encapsula su lógica lo que lo hace fácil de extender ya que  añadir un nuevo estado solo requiere una nueva clase y evita grandes bloques de if/else que hacen el código ilegible.
  
-====== Componentes de la FSM ======+====== Enfoque orientado a Objetos ======
 ===== class State: ===== ===== class State: =====
  
-Clase base para todos los estados del NPC. Cada estado define qué hacer al entrar, ejecutar y salir.+Clase base para todos los estados del NPC. Cada estado define una interfaz común que define: 
 + 
 +  * ''enter'': qué hacer al entrar en el estado,  
 +  * ''execute'' (o  ''update''): qué hacer cuando se está en ese estado 
 +  * ''exit'': qué hacer al salir del estado. 
 +  * ''get_next_state_class'': define el estado al que se pasa ante la llegada de un evento.
  
   def enter(self, npc):  → Acción al entrar en el estado.   def enter(self, npc):  → Acción al entrar en el estado.
Línea 54: Línea 60:
 ===== Transiciones entre estados ===== ===== Transiciones entre estados =====
  
-Hay que definir para cada estado un diccionario denominado transitions con el evento que provoca una transición y a qué estado se mueve.+ 
 +Las transiciones de un estado a otros se pueden definir en el método ''get_next_state_class(self, event)'' de cada estado.  
 + 
 + 
 +Otras implementaciones definen las transiciones entre estados como un diccionario de pares ''"evento":estado''. Por ejemplo se puede definir para cada estado un diccionario denominado ''transitions'' con el evento que provoca una transición y a qué estado se mueve. 
  
 <code python> <code python>
 # Definir transiciones para NPCTimido # Definir transiciones para NPCTimido
 TimidoPatrolState.transitions = {"player_seen": TimidoChaseState} TimidoPatrolState.transitions = {"player_seen": TimidoChaseState}
 +TimidoChaseState.transitions = {"player_too_close": TimidoFleeState, "player_lost": TimidoPatrolState}
 +...
 </code> </code>
  
Línea 65: Línea 78:
 En esta imagen se muestra el comportamiento de tres NPCs distintos modelados usando FSM. Los estados se muestran en azul los eventos que provocan las transiciones entre estados aparecen sobre las flechas. En esta imagen se muestra el comportamiento de tres NPCs distintos modelados usando FSM. Los estados se muestran en azul los eventos que provocan las transiciones entre estados aparecen sobre las flechas.
  
-{{:public:vj1231:fsm:npc_normal_fsm.svg?400|}}+### 🟢 NPC Normal 
 + 
 +Es el más simple: solo decide entre perseguir o patrullar según si detecta al jugador. 
 + 
 +{{:public:vj1231:fsm:npc_normal_fsm.svg?600|}} 
 + 
 +### 🟠 NPC Tímido 
 + 
 +Su comportamiento cambia drásticamente dependiendo de si está en "misión de alerta" (buscando al guardia para reportar la posición del jugador): 
 +   - Si **está en alerta**, prioriza su seguridad (huye hacia un guardia o completa un informe). 
 +   - Si **no está en alerta**, se comporta de forma más agresiva (inicia la alerta si el jugador está cerca, o lo sigue si está lejos). 
 + 
 +{{:public:vj1231:fsm:npc_timido_fsm.svg?600|}} 
 + 
 + 
 +### 🔵 NPC Guardia 
 + 
 +tiene un comportamiento intermedio. Si no ve al jugador, actúa como un "investigador": va a la última posición reportada del jugador si tiene esa información, o vuelve a patrullar si no. 
  
-{{:public:vj1231:fsm:npc_timido_fsm.svg?400|}} 
  
-{{:public:vj1231:fsm:npc_guardia_fsm.svg?400|}}+{{:public:vj1231:fsm:npc_guardia_fsm.svg?600|}}
  
-Puedes ver y ejecutar el ejemplo en este {{ :public:vj1231:fsm:fsm.v3.tgz |script de python}}+Puedes ver y ejecutar el ejemplo en este {{ :public:vj1231:fsm:fsm.v4.py.tgz |script de python}}
public/vj1231/fsm/start.1791286800.txt.gz · Última modificación: por mperez