有限状态机(Finite State Machine, FSM)是一种用于控制系统状态和状态转换的模型,广泛应用于游戏中的角色行为控制、AI逻辑等场景。下面是一个用 Lua 编写的简单有限状态机算法示例。
有限状态机类
-- 定义状态类
State = {}
State.__index = State
function State:new(name)
local state = {
name = name,
transitions = {}
}
setmetatable(state, State)
return state
end
function State:addTransition(event, targetState)
self.transitions[event] = targetState
end
function State:getTargetState(event)
return self.transitions[event]
end
-- 定义有限状态机类
FSM = {}
FSM.__index = FSM
function FSM:new(initialState)
local fsm = {
currentState = initialState
}
setmetatable(fsm, FSM)
return fsm
end
function FSM:handleEvent(event)
local targetState = self.currentState:getTargetState(event)
if targetState then
print("状态从 " .. self.currentState.name .. " 转换到 " .. targetState.name .. " 由于事件 " .. event)
self.currentState = targetState
else
print("事件 " .. event .. " 在状态 " .. self.currentState.name .. " 下无效")
end
end
-- 测试有限状态机算法
local idleState = State:new("Idle")
local walkingState = State:new("Walking")
local runningState = State:new("Running")
idleState:addTransition("walk", walkingState)
walkingState:addTransition("run", runningState)
walkingState:addTransition("stop", idleState)
runningState:addTransition("stop", idleState)
local fsm = FSM:new(idleState)
fsm:handleEvent("walk")
fsm:handleEvent("run")
fsm:handleEvent("stop")
fsm:handleEvent("run")
解释
-
State类:定义了一个状态类,包含状态名称和状态转换表。
new 方法:创建一个新的状态实例。
addTransition 方法:添加状态转换,接受事件和目标状态作为参数。
getTargetState 方法:根据事件获取目标状态。
-
FSM类:定义了一个有限状态机类,包含当前状态。
new 方法:创建一个新的有限状态机实例,接受初始状态作为参数。
handleEvent 方法:处理事件,根据当前状态和事件进行状态转换。
-
测试代码:创建了一些状态实例,并定义了状态转换规则。然后创建一个有限状态机实例,并通过一系列事件来测试状态转换。
输出
运行上述代码将输出以下内容:
状态从 Idle 转换到 Walking 由于事件 walk
状态从 Walking 转换到 Running 由于事件 run
状态从 Running 转换到 Idle 由于事件 stop
事件 run 在状态 Idle 下无效
这个简单的有限状态机算法可以根据实际需求进行扩展和优化,例如引入更多的状态和事件、处理复杂的状态转换逻辑等。通过合理的有限状态机算法,可以有效控制游戏中的角色行为和AI逻辑,提升游戏的可玩性和智能性。 |