欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOCX文档下载
 

有限状态机设计与实现

  • 资源ID:189010031       资源大小:123.33KB        全文页数:26页
  • 资源格式: DOCX        下载积分:25积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要25积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

有限状态机设计与实现

游戏引擎目录一、实验目的二、实验要求三、实验内容及原理四、实验设计思路五、状态转换表六、静态类图七、关键代码八、调试截图一、实验目的通过深入研究分析、设计、实现及测试有限状态机架构,掌握常规的FSM架构设 计与实现。二、实验要求1)FSM状态装换图。2)设计算法的静态类图3)采用基于数据结构的方法、或STL/JDK标准类库编写代码4)可选择C+、Java其中一种语言5)程序测试用例:设定某种初始状态,之后智能体在各状态间正常随机转化即可。三、实验原理及内容有限状态机(FSM),简称状态机,是表示有限个状态以及在这些状态之间的 转移和动作等行为的数学模型。可以这样理解,系统的行为如果在不同的时间(环 境)下,其工作不同,并且行为可以分成所谓的有限的状态以及不重叠的程序块 时,系统显现出了状态行为。有限状态机的基本原理图(ChairMan Mao的):总之,“有限状态机”是一个有限的状态组成的,其中的一个状态是“当前状态”。 “有限状态机”可以接受一个“输入”,这个“输入”的结果将导致一个“状态 转换”的发生(即从“当前状态”转换到“输出”状态)。这个“状态转换”是 基于“状态转换函数”的。状态转换完成之后,“输出状态”即变成了 “当前状 态”。根据这些输入输出,可以画出状态转移表(ChairMan Mao的状态转移表)当前状态输入条件输出状态Walk群众向主席握手ShakeHand群众向主席挥手WaveHand群众向主席敬礼DownHat群众走路WalkShakeHand群众向主席握手ShakeHand群众向主席挥手WaveHand群众向主席敬礼DownHat群众走路WalkWaveHand群众向主席握手ShakeHand群众向主席挥手WaveHand群众向主席敬礼DownHat群众走路WalkDownHat群众向主席握手ShakeHand群众向主席挥手WaveHand群众向主席敬礼DownHat群众走路Walk智能体隔一定时间查询这个表格,以使得它能够从游戏环境接收消息,来进 行必需的状态转换。每一个状态都能够实现为彼此分离的与智能体不耦合的对象 或函数,以提供清晰和可伸缩的架构。这一设计不像if . then/Switch架构那 样成为意大利面条。这种方式也就是将状态迁移的所有可能固化,甚至在游戏中作为脚本提供。这样的话,一方面易于理解,因为逻辑集中;另一方面维护容易,要增加新的状 态与控制逻辑,在迁移表中修改即可,甚至可以动态修改。C+的指针完美地支 持了这一点。在状态变化比较简单的情况下,这是一种比较可取的方法。但是如 果状态变化比较复杂或者控制逻辑比较复杂的话,查表过程可能会花费较多时 间。四、实验设计思路在ChairMan这个项目当中一共设计了三个有限状态机,分别是毛主席ChairMan, 群众化身Audience和情报员Intelligencer。其中毛主席有限状态机与群众化身 之间通过消息系统进行交流互动。这两个有限状态机有同样的状态,分别是:走 路、握手、挥手、敬礼。为了做到毛主席根据群众化身状态翻转做相应的翻转, 设计了一个拥有4个消息种类的消息系统。这四个消息分别是:Msg_waveHand, Msg_shakeHand,Msg_downHat,Msg_walk;群众化身Audience向毛主席ChairMan 发送消息,毛主席状态机就会发生相应的状态转移。而群众化身Audience的状态 转移是随机分配的。由RandFloat()的大小来决定状态翻转。情报员有限状态机则是在自己的状态机里翻转,它有三个状态,分别是:全局状 态GlobalState、收集情报Investigation和汇报情报GetReport。由于技术还不 够成熟,没有增加毛主席听报告的状态和消息设置,这也是将要扩展的功能。五、状态转换表A、ChairMan状态转移表当前状态输入条件输出状态Walk群众向主席握手ShakeHand群众向主席挥手WaveHand群众向主席敬礼DownHat群众走路WalkShakeHand群众向主席握手ShakeHand群众向主席挥手WaveHand群众向主席敬礼DownHat群众走路WalkWaveHand群众向主席握手ShakeHand群众向主席挥手WaveHand群众向主席敬礼DownHat群众走路WalkDownHat群众向主席握手ShakeHand群众向主席挥手WaveHand群众向主席敬礼DownHat群众走路WalkB、Audience状态转移表当前状态输入条件输出状态DoWalkRandFloat() < 0.4DoWaveHand(RandFloat()>0.4)&&(RandFloat()<0.6)DoShakeHand(RandFloat() > 0.6)&&(RandFloat() < 1)DoDownHatDoShakeHandRandFloat() < 0.4DoWaveHand(RandFloat()>0.4)&&(RandFloat()<0.6)DoWalk(RandFloat() > 0.6)&&(RandFloat() < 1)DoDownHatDoWaveHandRandFloat() < 0.4DoWalk(RandFloat()>0.4)&&(RandFloat()<0.6)DoShakeHand(RandFloat() > 0.6)&&(RandFloat() < 1)DoDownHatDoDownHatRandFloat() < 0.4DoWaveHand(RandFloat()>0.4)&&(RandFloat()<0.6)DoShakeHand(RandFloat() > 0.6)&&(RandFloat() < 1)DoWalk六、静态类图A、ChairMan静态类图(部分)群众向主席挥手群众走路群众向 王席散礼WaveHandShakeHand群众向主席握手DownHatWalkC、Intelligencer 静态类图返回前一状态七、关键代码1)项目头文件(3-miscE ConsoleUtils.h屈 CrudeTimer.cppE CrudeTimer.hE utils.hI白“曰头文件E Audience.hE AudienceOwnedStates.hE BaseGameEntity.hE Chairh/lan.hE ChairManOwnedStates.hE EntityManager.hE EntityNames.hE Intelligencer.hE IntelligencerOwnedStates.hE MessageDispatcher.hE MessageTypes.hE State.hE Stateh/lachine.hE Telegram.h2)项目源文件e - n般件色I Audience.cpp同 AudienceOwnedStates.cpp同 BaseGameEntity.cpp同 Chairh/lan.cpp羽 Chairh/lanOwnedStates.cpp羽 EntityManager.cpp羽 Intelligencer.cpp羽 IntelligencerOwnedStates.cpp对 main.cpp羽 MessageDispatcher.cppi白资敬件3)关键代码ChairManOwnedStates.cpp #include utils.h #include ChairManOwnedStates.h#include "State.h #include ChairMan.h #include Telegram.h#include "MessageDispatcher.h#include "MessageTypes.h#include CrudeTimer.h#include EntityNames.h #include <iostream> using std:cout;#ifdef TEXTOUTPUT#include <fstream> extern std:ofstream os; #define cout os#endif/methods for WalkWalk* Walk:Instance()(static Walk instance;return instance;void Walk:Enter(ChairMan* pChairMan)(void Walk:Execute(ChairMan* pChairMan)(cout << n << GetNameOfEntity(pChairMan->ID() << : << 毛主席在路上继续走着。";void Walk:Exit(ChairMan* pChairMan)(bool Walk:OnMessage(ChairMan* pChairMan, const Telegram& msg)(SetTextColor(BACKGROUND_RED|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUN D_BLUE);switch (msg.Msg)(case Msg_waveHand:cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(WaveHand:Instance();return true;case Msg_shakeHand:cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(ShakeHand:Instance();return true;case Msg_downHat :cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(DownHat:Instance();return true;/end switchreturn false; /send message to global message handler/methods for ShakeHandShakeHand* ShakeHand:Instance()(static ShakeHand instance;return &instance;void ShakeHand:Enter(ChairMan* pChairMan)(void ShakeHand:Execute(ChairMan* pChairMan)(/wealthy enough to have a well earned rest?cout << "n" << GetNameOfEntity(pChairMan->ID() << :<< "毛主席与群众握手!;/pChairMan->GetFSM()->RevertToPreviousState();void ShakeHand:Exit(ChairMan* pChairMan)(bool ShakeHand:OnMessage(ChairMan* pChairMan, const Telegram& msg)(SetTextColor(BACKGROUND_RED|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUN D_BLUE);switch (msg.Msg)(case Msg_waveHand:cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(WaveHand:Instance();return true;case Msg_shakeHand:cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(ShakeHand:Instance();return true;case Msg_downHat :cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(DownHat:Instance();return true;/end switchreturn false; /send message to global message handler/methods for DownHatDownHat* DownHat:Instance()(static DownHat instance;return instance;void DownHat:Enter(ChairMan* pChairMan)(void DownHat:Execute(ChairMan* pChairMan)(cout << "n" << GetNameOfEntity(pChairMan->ID() << :<< "毛主席向群众敬礼;void DownHat:Exit(ChairMan* pChairMan)(bool DownHat:OnMessage(ChairMan* pChairMan, const Telegram& msg)(SetTextColor(BACKGROUND_RED|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUN D_BLUE);switch (msg.Msg)(case Msg_waveHand:cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(WaveHand:Instance();return true;case Msg_shakeHand:cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(ShakeHand:Instance();return true;case Msg_downHat :cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(DownHat:Instance();return true;/end switchreturn false; /send message to global message handler/WaveHandWaveHand* WaveHand:Instance()(static WaveHand instance;return instance;void WaveHand:Enter(ChairMan* pChairMan)(void WaveHand:Execute(ChairMan* pChairMan)(cout << n << GetNameOfEntity(pChairMan->ID() << : << 毛主席 与小男孩挥手:再见,细伢子!";void WaveHand:Exit(ChairMan* pChairMan)(bool WaveHand:OnMessage(ChairMan* pChairMan, const Telegram& msg)(SetTextColor(BACKGROUND_RED|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUN D_BLUE);switch (msg.Msg)(case Msg_waveHand:cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(WaveHand:Instance();return true;case Msg_shakeHand:cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(ShakeHand:Instance();return true;case Msg_downHat :cout << "n Message handled by " << GetNameOfEntity(pChairMan->ID()<< "at time: " << Clock->GetCurrentTime();pChairMan->GetFSM()->ChangeState(DownHat:Instance();return true;/end switchreturn false; /send message to global message handlerAudienceOwnedStates.cpp:#include AudienceOwnedStates.h #include ChairManOwnedStates.h#include "Audience.h #include "CrudeTimer.h#include "MessageDispatcher.h#include "MessageTypes.h#include "EntityNames.h#include "utils.h #include <iostream> using std:cout;#ifdef TEXTOUTPUT#include <fstream> extern std:ofstream os;#define cout os#endif/DoWalkDoWalk* DoWalk:Instance()(static DoWalk instance;return instance;void DoWalk:Enter(Audience* audience)(void DoWalk:Execute(Audience* audience)(cout << n << GetNameOfEntity(audience->ID() << :群众在路上走着!;if (RandFloat() < 0.4)(audience->GetFSM()->ChangeState(DoWaveHand:Instance();if (RandFloat() > 0.4)&&(RandFloat() < 0.6)(audience->GetFSM()->ChangeState(DoShakeHand:Instance();if (RandFloat() > 0.6)&&(RandFloat() < 1)(audience->GetFSM()->ChangeState(DoDownHat:Instance();void DoWalk:Exit(Audience* audience)(bool DoWalk:OnMessage(Audience* audience, const Telegram& msg)(return false;DoDownHat敬礼/DoDownHat* DoDownHat:Instance() (static DoDownHat instance; return &instance; void DoDownHat:Enter(Audience* audience) ( void DoDownHat:Execute(Audience* audience) (<<:群众向主席敬cout << n << GetNameOfEntity(audience->ID() 礼!"/time delay/sender ID/receiver IDDispatch->DispatchMessage(SEND_MSG_IMMEDIATELY, audience->ID(), ent_ChairMan, Msg_downHat, NO_ADDITIONAL_INFO);/msgif (RandFloat() < 0.4)( audience->GetFSM()->ChangeState(DoWaveHand:Instance(); if (RandFloat() > 0.4)&&(RandFloat() < 0.6)(audience->GetFSM()->ChangeState(DoShakeHand:Instance();if (RandFloat() > 0.6)&&(RandFloat() < 1)(audience->GetFSM()->ChangeState(DoWalk:Instance();void DoDownHat:Exit(Audience* audience)(bool DoDownHat:OnMessage(Audience* audience, const Telegram& msg)(return false;/DoShakeHand/握手DoShakeHand* DoShakeHand:Instance()(static DoShakeHand instance;return &instance;void DoShakeHand:Enter(Audience* audience)(void DoShakeHand:Execute(Audience* audience)(cout << "n" << GetNameOfEntity(audience->ID() << ":群众做出和主席 握手的手势。"Dispatch->DispatchMessage(SEND_MSG_IMMEDIATELY, /time delayaudience->ID(),/sender IDent_ChairMan,/receiver IDMsg_shakeHand,NO_ADDITIONAL_INFO);/msgif (RandFloat() < 0.4)(audience->GetFSM()->ChangeState(DoWaveHand:Instance();if (RandFloat() > 0.4)&&(RandFloat() < 0.6)(audience->GetFSM()->ChangeState(DoWalk:Instance();if(RandFloat() > 0.6)&&(RandFloat() < 1)(audience->GetFSM()->ChangeState(DoDownHat:Instance();void DoShakeHand:Exit(Audience* audience)(bool DoShakeHand:OnMessage(Audience* audience, const Telegram& msg)(return false;/DoWaveHand/挥手DoWaveHand* DoWaveHand:Instance()(static DoWaveHand instance;return &instance;void DoWaveHand:Enter(Audience* audience)(void DoWaveHand:Execute(Audience* audience)(cout << "n" << GetNameOfEntity(audience->ID() << ":群众做出和主席 挥手的手势。"Dispatch->DispatchMessage(SEND_MSG_IMMEDIATELY,/time delayaudience->ID(),/sender IDent_ChairMan,/receiver IDMsg_waveHand,/msgNO_ADDITIONAL_INFO);if (RandFloat() < 0.4)(audience->GetFSM()->ChangeState(DoWalk:Instance();if (RandFloat() > 0.4)&&(RandFloat() < 0.6)(audience->GetFSM()->ChangeState(DoShakeHand:Instance();if(RandFloat() > 0.6)&&(RandFloat() < 1)(audience->GetFSM()->ChangeState(DoDownHat:Instance();void DoWaveHand:Exit(Audience* audience)(bool DoWaveHand:OnMessage(Audience* audience, const Telegram& msg)(return false;IntelligencerOwnedStates.cpp: #include IntelligencerOwnedStates.h#include "ChairManOwnedStates.h” #include Intelligencer.h#include "CrudeTimer.h”#include "MessageDispatcher.h#include "MessageTypes.h”#include "EntityNames.h”#include <iostream> using std:cout;#ifdef TEXTOUTPUT#include <fstream> extern std:ofstream os;#define cout os#endif/GlobalStateIntelligencerGlobalState* IntelligencerGlobalState:Instance() (static IntelligencerGlobalState instance;return instance;void IntelligencerGlobalState:Execute(Intelligencer* intelligencer)(/1 in 10 chance of needing the bathroom (provided she is not already /in the bathroom)if ( (RandFloat() < 0.6) &&!intelligencer->GetFSM()->isInState(*GetReport:Instance()(intelligencer->GetFSM()->ChangeState(GetReport:Instance();bool IntelligencerGlobalState:OnMessage(Intelligencer* intelligencer, const Telegram& msg)(return false;/InvestigationInvestigation * Investigation:Instance() (static Investigation instance;return &instance;void Investigation:Enter(Intelligencer* intelligencer) (void Investigation:Execute(Intelligencer* intelligencer)(cout << n << GetNameOfEntity(intelligencer->ID() << :侦查员在 前沿侦查情报。"void Investigation:Exit(Intelligencer* intelligencer)(bool Investigation:OnMessage(Intelligencer* intelligencer, const Telegram& msg)(return false;/GetReportGetReport* GetReport:Instance()(static GetReport instance;return &instance;void GetReport:Enter(Intelligencer* intelligencer)(cout << n << GetNameOfEntity(intelligencer->ID() << ”:收集到重 要情报!"void GetReport:Execute(Intelligencer* intelligencer)(cout << n << GetNameOfEntity(intelligencer->ID() << ”:赶紧记录 下来情报!;intelligencer->GetFSM()->RevertToPreviousState();void GetReport:Exit(Intelligencer* intelligencer)(cout << n << GetNameOfEntity(intelligencer->ID() << ”:向主席回 报紧急情报!" bool GetReport:OnMessage(Intelligencer* intelligencer, const Telegram& msg)(return false;Main.cpp :#include <fstream>#include <time.h>#include "ChairMan.h”#include "Audience.h"#include "Intelligencer.h”#include "EntityManager.h”#include "MessageDispatcher.h”#include "ConsoleUtils.h”#include "EntityNames.h”std:ofstream os;int main()(/define this to send output to a text file (see locations.h)#ifdef TEXTOUTPUTos.open(output.txt);#endif/seed random number generator srand(unsigned) time(NULL);Audience* pAudience = new Audience(ent_Audience);ChairMan* pChairMan = new ChairMan(ent_ChairMan);Intelligencer* pIntelligencer = new Intelligencer(ent_Intelligencer);/register them with the entity managerEntityMgr->RegisterEntity(pChairMan);EntityMgr->RegisterEntity(pAudience);EntityMgr->RegisterEntity(pIntelligencer);/run Bob and Elsa through a few Update calls for (int i=0; i<30; +i)(pAudience->Update();pChairMan->Update();pIntelligencer->Update();/dispatch any delayed messagesDispatch->DispatchDelayedMessages();Sleep(800);/tidy updelete pChairMan;delete pAudience;delete pIntelligencer;/wait for a keypress before exiting PressAnyKeyToContinue();return 0;23

注意事项

本文(有限状态机设计与实现)为本站会员(ba****u)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!