有限状态机设计与实现Word文件下载.docx

上传人:b****2 文档编号:4531226 上传时间:2023-05-03 格式:DOCX 页数:30 大小:107.13KB
下载 相关 举报
有限状态机设计与实现Word文件下载.docx_第1页
第1页 / 共30页
有限状态机设计与实现Word文件下载.docx_第2页
第2页 / 共30页
有限状态机设计与实现Word文件下载.docx_第3页
第3页 / 共30页
有限状态机设计与实现Word文件下载.docx_第4页
第4页 / 共30页
有限状态机设计与实现Word文件下载.docx_第5页
第5页 / 共30页
有限状态机设计与实现Word文件下载.docx_第6页
第6页 / 共30页
有限状态机设计与实现Word文件下载.docx_第7页
第7页 / 共30页
有限状态机设计与实现Word文件下载.docx_第8页
第8页 / 共30页
有限状态机设计与实现Word文件下载.docx_第9页
第9页 / 共30页
有限状态机设计与实现Word文件下载.docx_第10页
第10页 / 共30页
有限状态机设计与实现Word文件下载.docx_第11页
第11页 / 共30页
有限状态机设计与实现Word文件下载.docx_第12页
第12页 / 共30页
有限状态机设计与实现Word文件下载.docx_第13页
第13页 / 共30页
有限状态机设计与实现Word文件下载.docx_第14页
第14页 / 共30页
有限状态机设计与实现Word文件下载.docx_第15页
第15页 / 共30页
有限状态机设计与实现Word文件下载.docx_第16页
第16页 / 共30页
有限状态机设计与实现Word文件下载.docx_第17页
第17页 / 共30页
有限状态机设计与实现Word文件下载.docx_第18页
第18页 / 共30页
有限状态机设计与实现Word文件下载.docx_第19页
第19页 / 共30页
有限状态机设计与实现Word文件下载.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

有限状态机设计与实现Word文件下载.docx

《有限状态机设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《有限状态机设计与实现Word文件下载.docx(30页珍藏版)》请在冰点文库上搜索。

有限状态机设计与实现Word文件下载.docx

有限状态机(FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

可以这样理解,系统的行为如果在不同的时间(环境)下,其工作不同,并且行为可以分成所谓的有限的状态以及不重叠的程序块时,系统显现出了状态行为。

有限状态机的基本原理图(ChairManMao的):

ShakeHand

群众向主席挥手

群众向主席握手

WaveHand

DownHat

群众握手群众敬礼

群众挥手

Walk

群众走路群众向

群众走路主席敬礼

总之,“有限状态机”是一个有限的状态组成的,其中的一个状态是“当前状态”。

“有限状态机”可以接受一个“输入”,这个“输入”的结果将导致一个“状态转换”的发生(即从“当前状态”转换到“输出”状态)。

这个“状态转换”是基于“状态转换函数”的。

状态转换完成之后,“输出状态”即变成了“当前状态”。

根据这些输入输出,可以画出状态转移表(ChairManMao的状态转移表)

当前状态

输入条件

输出状态

Walk

群众向主席握手

ShakeHand

群众向主席挥手

WaveHand

群众向主席敬礼

群众走路

智能体隔一定时间查询这个表格,以使得它能够从游戏环境接收消息,来进行必需的状态转换。

每一个状态都能够实现为彼此分离的与智能体不耦合的对象或函数,以提供清晰和可伸缩的架构。

这一设计不像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状态转移表

B、Audience状态转移表

DoWalk

RandFloat()<

0.4

DoWaveHand

(RandFloat()>

0.4)&

&

(RandFloat()<

0.6)

DoShakeHand

(RandFloat()>

0.6)&

(RandFloat()<

1)

DoDownHat

DoShakeHand

DoWaveHand

DoWalk

DoShakeHand

A、ChairMan静态类图(部分)

B、Audience静态类图

(RandFloat()>

RandFloat()<

(RandFloat()<

0.6)RandFloat()<

(RandFloat()>

(RandFloat()<

C、Intelligencer静态类图

Investigation

GetReport

十分之六返回前一状态

的机率

1)项目头文件

2)项目源文件

3)关键代码

ChairManOwnedStates.cpp

#include"

utils.h"

ChairManOwnedStates.h"

State.h"

ChairMan.h"

Telegram.h"

MessageDispatcher.h"

MessageTypes.h"

CrudeTimer.h"

EntityNames.h"

#include<

iostream>

usingstd:

:

cout;

#ifdefTEXTOUTPUT

fstream>

externstd:

ofstreamos;

#definecoutos

#endif

//------------------------------------------------------------------------methodsforWalk

Walk*Walk:

Instance()

{

staticWalkinstance;

return&

instance;

}

voidWalk:

Enter(ChairMan*pChairMan)

{

Execute(ChairMan*pChairMan)

cout<

<

"

\n"

<

GetNameOfEntity(pChairMan->

ID())<

毛主席在路上继续走着。

"

;

Exit(ChairMan*pChairMan)

boolWalk:

OnMessage(ChairMan*pChairMan,constTelegram&

msg)

SetTextColor(BACKGROUND_RED|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);

switch(msg.Msg)

{

caseMsg_waveHand:

cout<

\nMessagehandledby"

ID())

attime:

Clock->

GetCurrentTime();

pChairMan->

GetFSM()->

ChangeState(WaveHand:

Instance());

returntrue;

caseMsg_shakeHand:

ChangeState(ShakeHand:

caseMsg_downHat:

ChangeState(DownHat:

}//endswitch

returnfalse;

//sendmessagetoglobalmessagehandler

//------------------------------------------------------------------------methodsforShakeHand

ShakeHand*ShakeHand:

staticShakeHandinstance;

voidShakeHand:

//wealthyenoughtohaveawellearnedrest?

毛主席与群众握手!

//pChairMan->

RevertToPreviousState();

boolShakeHand:

SetTextColor(BACKGROUND_RED|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);

//------------------------------------------------------------------------methodsforDownHat

DownHat*DownHat:

staticDownHatinstance;

voidDownHat:

毛主席向群众敬礼"

boolDownHat:

//------------------------------------------------------------------------WaveHand

WaveHand*WaveHand:

staticWaveHandinstance;

voidWaveHand:

毛主席与小男孩挥手:

再见,细伢子!

boolWaveHand:

AudienceOwnedStates.cpp:

AudienceOwnedStates.h"

Audience.h"

//-------------------------------------------------------------DoWalk

DoWalk*DoWalk:

staticDoWalkinstance;

voidDoWalk:

Enter(Audience*audience)

Execute(Audience*audience)

GetNameOfEntity(audience->

群众在路上走着!

if(RandFloat()<

0.4){

audience->

ChangeState(DoWaveHand:

}

if((RandFloat()>

0.4)&

0.6)){

ChangeState(DoShakeHand:

1)){

ChangeState(DoDownHat:

Exit(Audience*audience)

boolDoWalk:

OnMessage(Audience*

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 自我管理与提升

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2