基础 | 简单的智能体----有限状态机(二)
本系列为笔者初学c/c++和游戏AI开发的学习经历,练习为主,不涉及到具体的游戏开发软件学习(如unity,虚幻4等),适合刚入门的小伙伴一起学习探讨,欢迎在评论区留下意见。
开发语言:c/c++ (11及以上)
开发平台:macOS mojave / Linux
编译器:vs Code / g++

从一个项目开始
一、虚拟的世界
1.1 Bob的一天
假设存在一个虚拟小镇,镇上生活着一个人Bob,镇里有一个矿场(产出金矿),一家银行(存储金矿),一间酒吧(喝酒休息),一间屋子(Bob睡觉的家)。Bob每天要做的事情就是到矿场里挖金矿,口袋里装满金矿后将金子存储到银行里;从银行出来如果钱够了Bob便会回到家里睡觉,若不够则继续到矿场里挖矿;期间只要他渴了就会停下手上的事到酒吧里喝酒,喝完酒之后则继续到矿场里挖矿;Bob睡完觉后,如果渴了则去酒吧喝酒,否则进矿场挖矿。
----《游戏人工智能编程案例精粹》
书中的例子,可怜的Bob一天的生活乏味可陈,但他每一次动作都有着极为明显的变化。Bob不管在哪一种状态中,只要发生了某种动作,一定会改变当前状态,变成另一种状态。
当然,Bob可能还会存在其他更多的状态和动作,以及这个镇子还会有其他人。但不论怎么增加复杂度,其根本构成都不会变。
我们将以Bob的一天为基础,在计算机中构建出一个虚拟的小世界,来模拟Bob的生活。
1.2 状态转换图和状态转换表
首先,我们用状态转换图和状态转换表来建模“Bob的一天”,这样可以更清晰的表示出其中的逻辑流动,有助于梳理逻辑结构,也可以很容易的发现逻辑流上的错误,并改正过来。

从图1里我们可以知道,Bob存在四种状态,以及几种改变状态的动作(条件):

有了清晰的逻辑流,我们就可以借助c/c++编程语言,在计算机中模拟出“Bob的一天”。
1.2 一个完整的例子

当然,具体的实现中,我们有许多其他的工作需要做,比如说采用什么样的设计模式,一个状态要持续多久,转换状态的条件要如何达成,等等。
这些我们将留到之后的章节详细的讲解。

参考:
《游戏人工智能编程案例精粹》
维基百科
相关代码下载:https://github.com/linpeijie/GameToy/tree/master/GameAI/FSM

