EG/plugins/user/state_machine/examples/ai_example.py
2025-10-30 11:46:41 +08:00

161 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
状态机示例
演示如何使用状态机插件创建和运行状态机
"""
from plugins.user.state_machine.core.state_machine import State
class IdleState(State):
"""空闲状态"""
def enter(self, context):
print("进入空闲状态")
if context:
context.set_data("state", "idle")
def execute(self, context):
print("执行空闲状态逻辑")
# 检查是否需要切换到巡逻状态
if context and context.get_data("need_patrol", False):
return context.states["patrol"]
return None
def exit(self, context):
print("退出空闲状态")
class PatrolState(State):
"""巡逻状态"""
def enter(self, context):
print("进入巡逻状态")
if context:
context.set_data("state", "patrol")
def execute(self, context):
print("执行巡逻状态逻辑")
# 更新巡逻计数
patrol_count = context.get_data("patrol_count", 0) if context else 0
if context:
context.set_data("patrol_count", patrol_count + 1)
# 检查是否需要切换到战斗状态
if context and context.get_data("need_combat", False):
return context.states["combat"]
# 检查是否巡逻次数足够,需要切换到休息状态
elif context and context.get_data("patrol_count", 0) >= 3:
return context.states["rest"]
return None
def exit(self, context):
print("退出巡逻状态")
class CombatState(State):
"""战斗状态"""
def enter(self, context):
print("进入战斗状态")
if context:
context.set_data("state", "combat")
def execute(self, context):
print("执行战斗状态逻辑")
# 检查是否需要切换到空闲状态
if context and context.get_data("need_idle", False):
return context.states["idle"]
return None
def exit(self, context):
print("退出战斗状态")
class RestState(State):
"""休息状态"""
def enter(self, context):
print("进入休息状态")
if context:
context.set_data("state", "rest")
def execute(self, context):
print("执行休息状态逻辑")
# 检查是否需要切换到空闲状态
if context and context.get_data("need_idle", False):
return context.states["idle"]
return None
def exit(self, context):
print("退出休息状态")
class SimpleContext:
"""简单的上下文类"""
def __init__(self):
self.data = {}
self.states = {
"idle": IdleState(),
"patrol": PatrolState(),
"combat": CombatState(),
"rest": RestState()
}
def get_data(self, key, default=None):
return self.data.get(key, default)
def set_data(self, key, value):
self.data[key] = value
def get_state(self, name):
return self.states.get(name)
def create_ai_state_machine(plugin):
"""
创建AI状态机示例
"""
# 创建状态机
state_machine = plugin.create_state_machine("ai_state_machine")
# 创建上下文
context = SimpleContext()
# 设置状态机上下文
state_machine.set_context(context)
# 初始状态设置为空闲
context.set_data("need_patrol", True)
context.set_data("need_combat", False)
context.set_data("need_idle", False)
context.set_data("patrol_count", 0)
# 切换到初始状态
state_machine.change_state(context.states["idle"])
return state_machine, context
def run_ai_example(plugin):
"""
运行AI状态机示例
"""
print("=== 状态机示例AI状态管理 ===")
# 创建状态机和上下文
state_machine, context = create_ai_state_machine(plugin)
# 运行状态机
for i in range(8):
print(f"\n--- 第 {i+1} 次更新 ---")
print(f"当前状态: {state_machine.get_current_state().name}")
# 更新状态机
state_machine.update()
# 模拟一些条件变化
if i == 2:
context.set_data("need_combat", True)
print("设置需要战斗")
elif i == 4:
context.set_data("need_combat", False)
context.set_data("need_idle", True)
print("设置需要空闲")
elif i == 6:
context.set_data("need_idle", False)
context.set_data("need_patrol", True)
print("设置需要巡逻")