Lua中使用状态机FSM简单例子

FSM 有限状态机:

一个有限状态机是一个设备,或者是一个设备模型,具有有限数量的状态,它可以在任何给定的时间根据输入进行操作,使得一个状态变换到另一个状态,或者是使一个输入或者一种行为的发生。一个有限状态机在任何瞬间只能处在一种状态。

进入动作
退出动作
更新动作

FsmMachine.lua

FsmMachine = {}

function FsmMachine:New()
    self.__index = self
    o = setmetatable({}, self)
    o.states = {}
    o.curState = nil
    return o
end

-- 添加状态
function FsmMachine:AddState(baseState)
    self.states[baseState.stateName] = baseState
end

-- 初始化默认状态
function FsmMachine:AddInitState(baseState)
    self.curState = baseState
end

-- 更新当前状态
function FsmMachine:Update()
    self.curState:OnUpdate()
end

-- 切换状态
function FsmMachine:Switch(stateName)
    if self.curState.stateName ~= stateName then
        self.curState:OnLeave()
        self.curState = self.states[stateName]
        self.curState:OnEnter()
    end
end

状态机基类
BaseState.lua

BaseState = {}

function BaseState:New(stateName)
    self.__index = self
    o = setmetatable({}, self)
    o.stateName = stateName
    return o
end

-- 进入状态
function BaseState:OnEnter()
end

-- 更新状态
function BaseState:OnUpdate()
end

-- 离开状态
function BaseState:OnLeave()
end

测试类
Main.lua

require("BaseState")
require("FsmMachine")
FsmMachineTest = {}

-----[状态A,覆盖BaseState方法]----------------
aState = BaseState:New("aState")

function  aState:OnEnter()
    print("aState:OnEnter()")
end

function  aState:OnUpdate()
    print("aState:OnUpdate()")
end

function  aState:OnLeave()
    print("aState:OnLeave()")
end

-----[状态B,覆盖BaseState方法]----------------
bState = BaseState:New("bState")

function  bState:OnEnter()
    print("bState:OnEnter()")
end

function  bState:OnUpdate()
    print("bState:OnUpdate()")
end

function  bState:OnLeave()
    print("bState:OnLeave()")
end

-----[测试状态机]-----------------------------
fsm = FsmMachine:New()
fsm:AddState(aState)
fsm:AddState(bState)
fsm:AddInitState(aState)

for i = 1, 10 do
    if i == 5 then
        fsm:Switch("bState")
    end
    fsm.curState:OnUpdate()
end

输出

aState:OnUpdate()
aState:OnUpdate()
aState:OnUpdate()
aState:OnUpdate()
aState:OnUpdate()
aState:OnLeave()
bState:OnEnter()
bState:OnUpdate()
bState:OnUpdate()
bState:OnUpdate()
bState:OnUpdate()
bState:OnUpdate()

原文地址:https://www.cnblogs.com/tangyongle/p/8135722.html

时间: 2024-08-29 18:54:52

Lua中使用状态机FSM简单例子的相关文章

C语言去除数组中重复的字符简单例子

#include <stdio.h> int main(void){ int a[10]={1,2,3,3,4,5,1,3,5,6}; int i,j; int zieo=0; for(i=0;i<10;i++) for(j=i+1;j<10;j++) { if(a[i]==a[j]) { a[j]=0; } } for(i=0;i<10;i++) { if(a[i]!=zieo) { printf("%d\t",a[i]); } } printf(&qu

android中引用javascript和在javascript中引用java的简单例子

在android中通过微webView是可以加载javascript代码的,与其说是javascript不如说是加载网页,其实就是html和javascript的结合等,通过html和javascript也可以创建安卓应用,因为android和javascript可以相互调用,下面是我介绍的一个简单的例子,大家可以参考.欢迎和大家一起交流. //允许JavaScript执行 webSettings.setJavaScriptEnabled(true); // 添加一个对象, 让javascrip

在JSP中使用Echarts的简单例子

引子 ECharts是百度出品的,一个使用 JavaScript 实现的开源可视化库.程序员在Web页面上引入并稍作配置就能做出漂亮的数据图表. 本篇文章简单介绍一下如何在JSP中使用Echarts,例子图如下: 上手 图表显示是需要数据的,但是Echarts官网教程中为了演示方便直接在页面js中填入数据,如Demo-未来一周气温变化所示."周一.周二.."等数据都直接在页面写好: xAxis : [ { type : 'category', boundaryGap : false,

Oracle中的存储过程简单例子

---创建表 create table TESTTABLE ( id1  VARCHAR2(12), name VARCHAR2(32) ) select t.id1,t.name from TESTTABLE t insert into TESTTABLE (ID1, NAME) values ('1', 'zhangsan'); insert into TESTTABLE (ID1, NAME) values ('2', 'lisi'); insert into TESTTABLE (ID1

Excel中的宏--VBA的简单例子

第一步:点击录制宏 第二步:填写宏的方法名 第三步:进行一系列的操作之后,关闭宏 第四步:根据自己的需要查看,修改宏 第六步:保存,一般是另存为,后缀名为.xlsm,否则宏语言不能保存. 到此为止恭喜你一个简单的宏已经制作成功,当然宏也可以调用Excel中的公式,例如:sum等,排序,布局,查询,等. Excel中常用对象的简单介绍: 800x600 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternet

Java中死锁的简单例子及其避免

死锁:当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞.比如,线程1已经持有了A锁并想要获得B锁的同时,线程2持有B锁并尝试获取A锁,那么这两个线程将永远地等待下去. 我们来看一个死锁的简单例子: 1 public class DeadLockTest 2 { 3 private static Object A = new Object(), B = new Object(); 4 5 public static void main(String[] args)

lua中ipairs与pairs区别与注意

lua中基础类   lbaselib.c 这里面定义的基础函数,函数指针数组; static const luaL_Reg base_funcs[] = { {"assert", luaB_assert}, {"collectgarbage", luaB_collectgarbage}, {"dofile", luaB_dofile}, {"error", luaB_error}, {"getmetatable&qu

Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

Lua中的协同程序 coroutine

Lua中的协程和多线程很相似,每一个协程有自己的堆栈,自己的局部变量,可以通过yield-resume实现在协程间的切换.不同之处是:Lua协程是非抢占式的多线程,必须手动在不同的协程间切换,且同一时刻只能有一个协程在运行.并且Lua中的协程无法在外部将其停止,而且有可能导致程序阻塞. 协同程序(Coroutine): 三个状态:suspended(挂起,协同刚创建完成时或者yield之后).running(运行).dead(函数走完后的状态,这时候不能再重新resume). coroutine