- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
--(完美WORD文档DOC格式,可在线免费浏览全文和下载)值得下载!
游戏中的状态机研究报告
姚慧敏
什么是状态机
关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。
状态机的分类和扩展
有限状态机
(1)有限状态机的定义和特征:有限状态机,它包含了有限个“状态”和状态之间的“转移”,彼此连成一个有向图。它主要用于整个游戏场景的管理或操作单个的游戏对象和人物。有限状态机也是一种有向图的数据结构,由三部分组成:
◎内在的所有条件;
◎输入条件;
◎状态之间起到连接作用的转换函数。
一个有限状态机是一个设备,或是一个模型,具有有限数量的状态。它可以在任何给定时间根据输入进行操作,使得系统从一个状态转换到另一个状态,或者是使一个输出或者一种行为的发生,一个有限状态机在任何瞬间只能处于一种状态。
(2)完成一个有限状态机
先记下AI要进行的基本行为,然后用图形表示,再变成实际的代码。下面以一个带有武器的士兵AI来举例说明怎样设计一个有限状态机。
AI规则:
敌人在户外区,没有障碍物
他有预定停留点,循环巡逻
当你进入敌人的视线锥面时,敌人激活
敌人看到你就追
他带有剑
如果离你很近,他就会停下来,用剑刺你
图形布局:
在编码之前,一定要用简单的框图得到所有状态和变换的全貌。状态用一个圆表示,而箭头则表示状态转换正在发生,标记好每一个状态和状态转换之间的条件,在接下来的编码中将会表现的更加清晰。
如下图所示,士兵有四种状态,到达停留点(Realign Waypoint)、寻找停留点(Seek Waypoint)、追逐玩家(Chase player)和攻击玩家(Fight player)。转换的条件有:
转弯(Aligned)、找到巡逻点(Waypoint Reached)、看见玩家(See player)、距离限制(Distance)、玩家死亡或离开视线(Player dead or lost sight)。
编写代码:
完成规则和图之后,编写有限状态机就是一件很简单的事情了。对于状态机中所有的状态,我们要先枚举出来,最好用0来代表初始的状态,用整数表示其他的状态。因此,如果有限状态机欧N个状态的话,则最后一个状态的枚举值应为N-1。我们学习了C++语言,因此用C++中的#define语句生产状态名。
有限状态机的程序框架如下所示:
#define SEEK_WAYPOINT 0
#define ROTATE_WAYPOINT 1
(…)
用一个整形变量表述AI所处的状态,从而驱动一个switch结构:
int state
switch(state)
{
case 0:
{
//这个状态的特定代码
break;
}
(…)
case N-1:
{
//这个状态的代码
break;
}
default:
{
break;
}
}
上面是一个有限状态机的代码框架,下面我们来完成我们的士兵状态机。
#define SEEK_WAYPOINT 0
#define ROTATE_WAYPOINT 1
#define CHASE_PLAYER 2
#define FIGHT_PLAYER 3
bool aligned;
bool reachwaypoint;
bool seeplayer;
bool playerlost;
bool distancelimited;
int state;
while(1){
switch(state)
{
case 0:
{
animation1();
if(reachwaypoint)
{
state=1;
}
else if(seeplayer)
{
state=2;
}
break;
}
case 1:
{
animation2();
if(aligned)
{
state=0;
}
break;
}
case 2:
{
if(playerlost)
{
state=0;
}
else if(!distancelimited)
{
state=3;
}
break;
}
case 3:
{
if(distancelimited)
{
sta
您可能关注的文档
最近下载
- 2023-2024学年高中下学期主题班会 世界读书日 读书,是门槛最低的高贵 课件 .pptx VIP
- 化解小学生争吵主题班会PPT课件.pptx VIP
- 儿童保健学试题库.pdf VIP
- CB-T 46-2007 船用搭焊钢法兰.pdf VIP
- 完整版老旧小区雨污分流改造工程施工组织设计方案(最全).doc
- 2023年广东省深圳市光明区中考二模物理试题(含答案解析).docx
- 四川省成都市石室中学2024届高二下学期期中半期考试物理试题(含答案及解析).docx
- 广东省深圳市宝安区2023-2024学年四年级下学期英语期中试卷(含答案).pdf VIP
- 2025届高考英语专项复习 非谓语动词 2020-2024高考真题专练(原卷版+解析版).docx VIP
- (完整版)高中生物必修二知识点总结(人教版复习提纲)期末必备-推荐文档.doc
文档评论(0)