状态机在设计某些功能的时候使用广泛,目前网上状态机自动生成工具有几种,分别如下所示:
FsmCrater:
FsmCrater
案例:[有限状态机代码生成器 FsmCrater]
SMC(The State Machine Compiler) :
SMC
官网:http://smc.sourceforge.net/
案例:状态机生成工具——SMC
Qfsm:
qfsm
官网:http://qfsm.sourceforge.net/
本文介绍:使用Qfsm结合SMC直接从状态机生成代码:
第一步、分别从qfsm和smc官网下载:qfsm-0.54.exe与Smc.jar软件及工具
qfsm-0.54.exe 下载
Smc.jar下载
第二步、qfsm-0.54.exe软件后如下图所示,具体使用请阅读官方文档:
第三步、按投币玩游戏逻辑绘制下面状态机,***在Entry和Exit的条件中,必须加括号,***否则生成代码会报错
**注新建文件是使用Free Text类型,否则无法生成Smc.jar可以使用的.sm文件
第四步、将输出的play.sm文件放到Smc.jar文件夹下,使用下面命令即可自动生成代码:本人C语言使用
最多,所以只生成C代码。
java -jar ./Smc.jar -c play.sm
Smc.jar功能强大,配合dot可生成png图形,生成代码如下所示,
第五步:将生成的状态机代码应用到自己的工程中,如图所示,创建工程
需要注意的是,在play_sm.h中
struct door;//该结构体需要用户自己定义,切格式固定,
struct door{
struct fsmContext _fsm; //在main中定义如下
};
在play_sm.c中的几个函数也需要用户实现,如下:
int door_enter_act_push(struct door *ctxt)
{
printf("the door enter act push\r\n");
}
int door_exit_act_push(struct door *ctxt)
{
printf("the door exit act push\r\n");
}
int door_entry_act_put(struct door *ctxt)
{
printf("the door enter act put\r\n");
}
int door_exit_act_put(struct door *ctxt)
{
printf("the door exit act put\r\n");
}
调试结果如下所示:
测试代码在GitHub上,请自行下载
https://github.com/LaddinWu/test_Qfsm.git