游戏状态机的设计与实现

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

什么是状态机:
     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设计图。

首先是通过接口定义通用状态机接口,然后定义了单间的接口。这种方式统一让所有的状态定义了三个函数,这三个函数这里不需要解释了,做游戏的人都能明白它的妙处。

在StateManager是专门管理角色状态的管理类,每个角色对象包含一个状态机管理类。

总结:

状态机的模型是非常简单,但并不是每个人都能设计好的状态机。因为好的状态机不仅需要对程序的把握要比较到位,同时需要对整个业务的理解比较到位。好的状态机使程序变的更加简洁,易扩展,容易查找bug,还非常稳定。坏得状态分割只会让程序晦涩难懂。

说明:

1、通过两个状态机实现了两个简单的猜数打怪兽游戏。

2、所有完整程序都可以到这个地址查看,下载,修改。

3、整个代码都是通过C++ 完成的,编译环境是osx 10.10 + LLVM 6.0 , C++使用 -std=c++1y。程序写了makefile,所以如果在其他平台只需要简单修改下makefile就可以快乐的玩耍了。

时间: 2024-10-13 04:23:20

游戏状态机的设计与实现的相关文章

Cocos2d 游戏状态机

加cocos2d 是标题党.其实跟cocos2d无关. 1.游戏背景介绍 比如有这么一个"记忆"类的比赛游戏.你和电脑对战,轮到谁的回合,谁翻两张牌,如果两张牌一样,就消掉这两张牌,得2分,可以继续翻牌,如果两张牌不一样,就换一个人.直到最后,看谁的得分高. 先把图画出来会清晰些: 2.先看下不好的设计方式 我们来设计游戏大致架构,用一个圈表示一个状态. typedef enum{ WaitingPlayer, CheckPlayer, AIThink, AIFirstCard, AI

《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)

注意:本系列教程为长篇连载无底洞,半路杀进来的朋友,如果看不懂的话,请从第一章开始看起,文章目录请点击下面链接. http://blog.csdn.net/lufy_legend/article/details/8888787 一,内容预览 算起来,游戏脚本系列文章已经很久没更新了,虽然该系列文章更新缓慢,但是确实还是能够帮到一些朋友,前段时间,仅仅因为做毕业设计通过邮件联系我的就有4位学生.有鉴于此,我还是挤点儿时间来继续慢慢更新一下了.另外,我想再声明一下,目前该脚本引擎还处在移植开发阶段,

移动互联网实战--社交游戏的排行榜设计和实现(1)

前言: 游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧重于传统关系型Mysql的方案实现, 后续会讲解Nosql的作用. 小编(mumuxinfei)对这块认识较浅, 所述观点不代表主流(工业界)做法, 望能抛砖引玉. 需求分析 曾几何时, 微信版飞机大战红极一时. 各路英雄刷排名, 晒成绩. 不过该排名限制在自己的好友圈中, 而每个用户的好友圈各不一

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

游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反向切换.代码如下: "普通显示"模式允许多个窗体同时显示,这种类型应用最多.例如RPG中的主城界面(见下图). "隐藏其他界面" 模式一般应用于全局性的窗体.我们在开发此类窗体时,为了减少UI渲染压力.提高Unity渲染效率,则设置被覆盖的窗体为"不可见&qu

游戏UI框架设计(二) : 最简版本设计

最简版本设计 --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状态)管理. UI框架设计主要目的,就是尽可能的完成一些与具体游戏功能逻辑无关的一些底层事务性的功能实现.这些功能最好是自动或者是半自动的实现,无须客户程序(调用框架的程序)过多处理与关心. 对于以上功能,笔者定义了UI框架的相关四个核心类: BaseUIForms    基础UI窗体脚本(父类,其他窗体都继承

游戏系统UI设计的考虑

一个游戏首先给人留下的印象便是游戏的UI设计,从一个玩家的角度可能可以比较好的对UI设计提出一些见解. 首先是简洁,玩家并不需要在游戏界面中获取太过复杂的信息,这反而会使他们对于游戏界面产生反感.其次是明了,以微软的Metro磁贴为例,在一个小方块上用简略的信息显示用户需要获取的信息,就可以在第一点简洁的基础上让用户获得足够的信息.第三是独特,一个独特的UI系统可能会使用户对整个游戏的印象分提高,典型的例子便是MineCraft的UI界面,与整个游戏的像素方块风格所协调,给人深刻的印象. 总而言

移动互联网实战--社交游戏的排行榜设计和实现(2)

前言: 游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧重讲解Nosql在游戏排名榜中的作用. 小编(mumuxinfei)对这块认识较浅, 所述观点不代表主流(工业界)做法, 望能抛砖引玉. 秉承: 上一篇文章, 详见: 社交游戏的排行榜设计和实现(1) 进阶篇: 随着数据量/并发量的上涨, Mysql集群也呈现了一些疲态. (1). 数据库分库分表后

【转】游戏新手教学设计

只靠新手教学,够呛~ 对于新手玩家,游戏一开始通常会有个 新手教学 ,上来先把游戏的主要功能介绍一遍.但教学结束后,玩家独自面对游戏时,难度一下子就很高了,突然面对绝壁高山的赶脚. 这样的游戏很常见,应该说是大多数游戏都是这样. Morden Command是个 塔防+即时 的游戏:经过一顿新手教学,在战斗中如何操作,基本还能掌握,但各种武器的购买.升级,就实在没太搞明白.好像一位着急的老师,冲上来猛一顿讲,讲完转身就走了,其实学生我完全没跟上. 仅仅靠 新手教学 就想解决掉新手玩家难上手的问题

游戏UI框架设计(五): 配置管理与应用

游戏UI框架设计(五) --配置管理与应用 在开发企业级游戏/VR/AR产品时候,我们总是希望可以总结出一些通用的技术体系,框架结构等,为简化我们的开发起到"四两拨千金"的作用.所谓"配置管理"是指一个游戏项目(软件项目),很多需要经常变化的需求或者数据,最好以配置文件的形式存在,从而代替"硬编码"方式.      这里笔者就对游戏产品中大量应用到动态加载的情形,开发出一套通用的配置管理(脚本)工具.该工具可以很方便的对于具备"键值对&