前言:
     游戏编程中对状态机的理解和应用,是体现程序员是否对游戏编程入门的重要指标。本篇文章描述状态机的原理,以及如何实现。并探讨状态机的扩展性和易用性。

什么是状态机:
     1、状态机是通过状态变量来描述不同状态
     2、状态机变量是互斥的
     3、状态机的分割是状态机好坏的标准

状态机的好处:
     1、降低整个系统的复杂性
     2、容易扩展
     3、容易维护

如何实现状态机:
     1、通过不同的状态分割逻辑
     2、通过面向对象思想来扩展和分割逻辑

状态机简单类型:

1、定义状态机类型

enum PlayerState{INVALID,STAND,MOVE,ATTACK,DIE
};

2、实现更新状态,在不同的状态执行不同的逻辑

void Player::Update(float ts){switch(user_state_){case STAND:Stand(ts);break;case MOVE:Move(ts);break;case ATTACK:Attack(ts);break;case DIE:Die();return;default:std::cout<<"error\n";}if(hp_ <= 0){SetState(DIE);}
}

3、切换状态,在切换状态的时候做一些事情

void Player::SetState(PlayerState state){if(state == user_state_){return;}switch(state){case STAND:std::cout << "----begin stand--------\n";break;case MOVE:std::cout << "----begin move--------\n";break;case ATTACK:std::cout << "----begin attack--------\n";break;case DIE:std::cout << "----begin die--------\n";break;default:std::cout <<"the state is error";break;}user_state_ = state;
}

这种状态机小而精悍,如果在一个对象中有很多标志量来标记实例的状态,这时候该考虑下通过这种小型的状态机来实现了。但是这种状态机如果状态变量比较多,扩展性并不好。并且复杂性会随着状态机的增多,指数型增加。整个编译单元的代码量也会很大,对易读性和维护性都是负面影响。

状态机面向对象类型:
     面向对象类的状态机是一种更容易扩展的新型状态机,通过单间实现方式,使用更少的内存,先看下整个状态机的uml设计图。

  首先是通过接口定义通用状态机接口,然后定义了单间的接口。这种方式统一让所有的状态实现三个函数,这三个函数分别对应切入状态,在状态中,退出状态,需要执行的逻辑分别放在这三个函数里执行,通过这样的分割,状态很容易扩展,也不会混乱。具体代码实现,请看下面说面里面github的地址。
在StateManager是专门管理角色状态的管理类,每个角色对象包含一个状态机管理类。
总结:
状态机的模型是非常简单,但并不是每个人都能设计好的状态机。因为好的状态机不仅需要对程序的把握要比较到位,同时需要对整个业务的理解比较到位。好的状态机使程序变的更加简洁,易扩展,容易查找bug,还非常稳定。坏得状态分割只会让程序晦涩难懂。
说明:
1、通过两个状态机实现了两个简单的猜数打怪兽游戏。
2、所有完整程序都可以到 这个地址查看,下载,修改。
3、整个代码都是通过C++ 完成的,编译环境是osx 10.10 + LLVM 6.0 , C++使用 -std=c++1y。程序写了makefile,所以如果在其他平台只需要简单修改下makefile就可以快乐的玩耍了。

游戏状态机的设计与实现相关推荐

  1. FPGA之道(54)状态机的设计

    文章目录 前言 状态机的设计 状态浅析 真正的状态 抽象的状态与中间变量 抽象状态的设计方法 抽象状态与中间变量的权衡 基本状态介绍 初始态 结束态 中继态 分支态 复位态 空闲态 多余态 状态的一些 ...

  2. 状态驱动的游戏智能体设计(下)

    本文由恋花蝶最初发表于http://blog.csdn.net/lanphaday,欢迎转载,但必须保持全文完整,也必须包含本声明. 译者并示取得中文版的翻译授权,翻译本文只是出于研究和学习目的.任何 ...

  3. 状态驱动的游戏智能体设计(中)

    本文由恋花蝶最初发表于http://blog.csdn.net/lanphaday,欢迎转载,但必须保持全文完整,也必须包含本声明. 译者并示取得中文版的翻译授权,翻译本文只是出于研究和学习目的.任何 ...

  4. 百万用户级游戏服务器架构设计

    百万用户级游戏服务器架构设计 服务器结构探讨 -- 最简单的结构 所谓服务器结构,也就是如何将服务器各部分合理地安排,以实现最初的功能需求.所以,结构本无所谓正确与错误:当然,优秀的结构更有助于系统的 ...

  5. 状态驱动的游戏智能体设计

    State-Driven Game Agent Design 状态驱动的游戏智能体设计 Mat Buckland著 赖勇浩(http://blog.csdn.net/lanphaday) 译 Note ...

  6. 状态驱动的游戏智能体设计(上)

    本文由恋花蝶最初发表于http://blog.csdn.net/lanphaday,欢迎转载,但必须保持全文完整,也必须包含本声明. 译者并示取得中文版的翻译授权,翻译本文只是出于研究和学习目的.任何 ...

  7. AI设计:如何给动作游戏的敌人设计人工智能?

    游戏中的AI可以简单的理解为计算机控制的智能角色,这些智能角色能够通过周遭环境或者事件的变化进行逻辑判断,从而同玩家进行产生特定的行为交互. 组成AI的三个基本元素: AI的基本逻辑,AI的基本能力, ...

  8. 游戏程序开发:状态驱动的游戏智能体设计 (二)

    转自: 状态驱动的游戏智能体设计(一) http://edu.gamfe.com/tutor/d/30601.html 状态驱动的游戏智能体设计(二) http://edu.gamfe.com/tut ...

  9. 游戏UI框架设计(三) : 窗体的层级管理

    游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...

最新文章

  1. Error:Execution failed for task ':app:dexDebug'. com.android.ide.common.process.ProcessException
  2. 如何设计 Web App 应用架构?「两分钟了解 IOING」
  3. PX4修改线程内存大小
  4. C语言写一函数交换两变量的值
  5. 解决 iOS 12.4 Killed: 9 的问题
  6. jstack命令使用
  7. oCam(屏幕录制) 一款小巧方便的专业屏幕录制软件 彻底解决你的录屏问题
  8. JSchException: Algorithm negotiation fail
  9. OCR文字识别算法与搭建流程
  10. Vim下快速删除字符串
  11. C语言中的int类型
  12. 粘贴时怎样跳过隐藏行,excel技巧
  13. Problem C: 点在圆内吗?
  14. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
  15. 一文了解各大数据库查询语言(Gremlin vs Cypher vs nGQL操作篇
  16. 苹果承认新一代iPad wifi问题 正调查原因
  17. Linux系统下海康工业相机MVS二次开发-Python
  18. nexus7二代刷Linux,大饱眼福: Nexus 7二代全拆解
  19. WebLogic安装补丁
  20. 肿瘤浸润淋巴细胞在病理图像上的空间组织与分子相关性

热门文章

  1. java正则表达式非贪婪_正则表达式贪婪与非贪婪模式(示例代码)
  2. uniapp(踩坑记录 持续更新)
  3. PHP Smarty 函数插件(自定义函数)html_checkboxes
  4. n个小球放入m个盒子中_N个球放入M个盒子中的情况分析
  5. php学习笔记-面向对象
  6. Flir Blackfly S 工业相机:配置多个摄像头进行同步拍摄
  7. 小程序源码:自带多平台解析接口短视频去水印图集-多玩法安装简单
  8. 移动无法访问函数不正确怎么才能把磁盘修好?
  9. 微信公众平台回复多条消息php,PHP微信公众平台开发 - 消息回复的封装_PHP教程...
  10. Kafka消息中间件(Kafka与MQTT区别)