《游戏人工智能编程案例精粹》读书笔记—状态驱动智能体设计

一个有限状态机是一个设备,或是一个设备模型,具有有限数量的状态,它可以在任何给定的时间根据输入进行操作,使得从一个状态变换到另一个状态,或者是促使一个输出或者一种行为的发生。一个有限状态机在任何瞬间只能处于一种状态。

状态变换表

状态变换表是一个条件和那些条件导致的状态的表,这个表可以被智能体在规则的间隔内训问,使得它能基于从游戏环境中接收到刺激进行必须的状态转换。

内置的规则

每个状态模块依靠自身的逻辑来决定它是否应该运行自己变换到一个替代状态,智能体只向外部提供操作和获取自身属性的函数,状态模块通过智能体提供的函数来找到必要的信息以处理规则。

这个方法的实现是将状态封装成对象,包含推动状态变换需要的逻辑。此外,所有状态对象共享一个通用的接口:一个称为 State 的纯虚类。这里提供一个简单接口的版本。

class State
{
public:
    virtual void Execute (Troll *troll) = 0;
};

想象一个 Troll 类,它具有成员变量表示特征,如健康、发怒、毅力等,还一个接口允许客户训完并调整那些值。一个 Troll 类可以被赋予有限状态机的功能性,只要增加一个指向 State 类继承对象的实例的指针和允许用户改变指针指向的实例的方法。

class Troll
{
    /*省略的属性*/
    State *m_pCurrentState;

public:
    /*省略的属性的接口*/
    void Update()
    {
        m_pCurrentState->Execute(this);
    }

    void ChangeState(const State *pNewState)
    {
        delete m_pCurrentState;
        m_pCurrentState = pNewState;
    }
};

当 Troll 类的更新方法被调用时,它反过来用 this 指针调用当前状态类型中的 Execute 函数,一个 Troll 类当更新时有怎样的行为可以完全依赖于当它当前状态的逻辑。用实例可以最佳地阐明这一点,让我们创建一堆状态,使 Troll 在感到危险时可以从敌人身边逃跑,并且当它感到安全时变为睡觉。

《游戏人工智能编程案例精粹》读书笔记—状态驱动智能体设计

时间: 2024-08-24 06:39:39

《游戏人工智能编程案例精粹》读书笔记—状态驱动智能体设计的相关文章

《游戏人工智能编程案例精粹》读书笔记—数学和物理学初探

1.1.1 笛卡尔坐标系 在二维空间中,笛卡尔坐标系被定义成两个坐标轴成直角相交并且用单位长度标出.水平轴称为x 轴,而垂直轴称为y 轴,两个轴的交点称为原点,如图1.1 所示. 如图1.1所示,每个坐标轴端点的箭头表示它们在每个方向上无限延伸.假想有一张无限大的纸,上面有x 轴和y 轴,纸就表示 xy 平面,所有二维的笛卡尔坐标系中的点都可以给制在这个平面上.在2D 空间中的一个点可以用一对坐标(x,y) 表示.x 和y 的值代表沿着各自的轴上的距离. 为了表达三维空间,需要另外一个坐标轴z铀

【游戏设计模式】之四 《游戏编程模式》读书笔记:全书内容梗概总结

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/53240330 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文的Github版本:QianMo/Reading-Notes/<游戏编程模式>读书笔记 这是一篇超过万字读书笔记,总结了<游戏编程模式>一书中所有章节与内容的知识梗概. 我们知道,游戏行业其实一直很缺一本系

《Linux/Unix系统编程手册》读书笔记9(文件属性)

<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有更深入的研究一定会写出来. 下图为磁盘分区与文件系统的关系 文件系统中的文件(目录)在i-node表上都有唯一的记录(i-node).i-node通过数据块指针指向数据块,这些数据块就是该i-node对应的文件的数据. i-node与数据块的关系如下: 因为Linux支持很多类型的文件系统,但是每种文件系统的

《Unix编程艺术》读书笔记(1)

<Unix编程艺术>读书笔记(1) 这两天开始阅读该书,下面是自己的体会,以及原文的摘录,虽然有些东西还无法完全吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance is a combination of power and simplicity. Elegant code does much with little. Elegant code is not only correct but visibly, transparently correct. It does

《游戏人工智能编程》感想一

书名<游戏人工智能编程>作者mat buckland 里面讲了一个west world项目.这是一个简单的玩具教学项目,为了让读者能够实现一个稍微具有智能的智能体.游戏的内容是 1一个矿工在挖金矿,会随机得到金矿,放入背包 2背包的容量有限,背包满则一定要去卖掉 3矿工有体力值,体力为0要休息. ps,书中有口渴值的存在.但是口渴饥饿什么的都是一种"疲劳值"引入游戏就是为了增加限制条件和增加程序的复杂度.所以对于新手(我)来说还是尽量减少程序复杂度好. 实现方法: 作者谈到

《Java并发编程实战》读书笔记

Subsections 线程安全(Thread safety) 锁(lock) 共享对象 对象组合 基础构建模块 任务执行 取消和关闭 线程池的使用 性能与可伸缩性 并发程序的测试 显示锁 原子变量和非阻塞同步机制 一.线程安全(Thread safety) 无论何时,只要多于一个线程访问给定的状态变量.而且其中某个线程会写入该变量,此时必须使用同步来协助线程对该变量的访问. 线程安全是指多个线程在访问一个类时,如果不需要额外的同步,这个类的行为仍然是正确的. 线程安全的实例: (1).一个无状

VC++编程之道读书笔记(2)

第三篇 技术细节 第七章:细说开发人员必知必会的39个开发细节 细节36:单例模式的应用 在开发程序时,往往需要在整个工程中只需要一个类的实例.而这个实例一旦被创建就不能被其他的实例再创建了,通常我们称这个实现过程为单例模式. 既然要保证类只有一个实例,那么就需要其他的类不能使用实例化该类.因此,需要将其构造方法设为私有的,即使用private关键字修饰.同时,类中提供一个静态方法,该方法的返回值是该类的一个实例.这样就只能使用该静态方法来获取类的实例了,从而保证了唯一性. 下面通过具体代码来实

VC++编程之道读书笔记

第二篇 缪误21:位图数据是按照红绿蓝顺序存储的 大家都知道位图的颜色是由红.绿.蓝三个分量构成的,但是位图颜色数据存储的方式则不是按照这个顺序存储的,而是按照蓝.绿.红的顺序存储的.并且对于真彩色位图来说,位图的颜色数据是倒序存储的,即位图的第一行数据位于位图数据的最底部. 第三篇 细节12 :内存中的数组 在C++中通过数组可以操作内存,创建数组时需要为数组分配内存空间,操作数组时就是对内存空间中的数组元素进行操作.数组创建后,数组引用和数组元素分别存储在栈内存和堆内存中,并通过数组引用与数

《Linux多线程编程手册》读书笔记

第二章 基本线程编程 1.(P25)如果多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止.然后,一个等待线程成功返回,其余的等待线程将失败并返回ESRCH错误. 2.(P26)将新线程的pbe参数作为栈参数进行传递.这个线程参数之所以能够作为栈参数传递,是因为主线程会等待辅助线程终止.不过,首选方法是使用malloc从堆分配存储,而不是传递指向线程栈存储的地址.如果将该参数作为地址传递到线程栈存储,则该地址可能无效或者在线程终止时会被重新分配. 3.(P28)pthread_de