找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

2

听众

108

主题
发表于 2024-7-5 17:07:41 | 查看: 69| 回复: 0

有限状态机(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")

解释

  1. State类:定义了一个状态类,包含状态名称和状态转换表。

    • new 方法:创建一个新的状态实例。
    • addTransition 方法:添加状态转换,接受事件和目标状态作为参数。
    • getTargetState 方法:根据事件获取目标状态。
  2. FSM类:定义了一个有限状态机类,包含当前状态。

    • new 方法:创建一个新的有限状态机实例,接受初始状态作为参数。
    • handleEvent 方法:处理事件,根据当前状态和事件进行状态转换。
  3. 测试代码:创建了一些状态实例,并定义了状态转换规则。然后创建一个有限状态机实例,并通过一系列事件来测试状态转换。

输出

运行上述代码将输出以下内容:

状态从 Idle 转换到 Walking 由于事件 walk
状态从 Walking 转换到 Running 由于事件 run
状态从 Running 转换到 Idle 由于事件 stop
事件 run 在状态 Idle 下无效

这个简单的有限状态机算法可以根据实际需求进行扩展和优化,例如引入更多的状态和事件、处理复杂的状态转换逻辑等。通过合理的有限状态机算法,可以有效控制游戏中的角色行为和AI逻辑,提升游戏的可玩性和智能性。

您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-3-13 00:07 , Processed in 0.497019 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表