1、有限状态机的定义

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

举个例子:

灯的开关是一个非常简单的有限状态机。他有两种状态:开或关。状态之间的变换是通过你手指的输入产生的。向上按开关,产生从关到开的状态变换,向下按开关,产生从开到关的状态变换。

2、有限状态机的实现

方法1、switch/if

以灯的开关为例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public enum StateType
{LightOn,LightOff
}
public class FSMTest : MonoBehaviour
{private StateType _state;private bool switchDir;//开关方向 false为向下,true为向上,通过你的输入可以改变这个值// Start is called before the first frame updatevoid Start(){_state = StateType.LightOff;switchDir = false;}// Update is called once per framevoid Update(){UpdateState(_state);}void UpdateState(StateType state){switch (state){//关灯状态case StateType.LightOff:if (switchDir){                    state = StateType.LightOn;//...一些别的操作}break;//开灯状态case StateType.LightOn:if (!switchDir){state = StateType.LightOff;//...一些别的操作}break;}}
}

上述方法在遇到状态较复杂,或者状态的拓展较频繁时,代码会变得非常难懂,拓展状态也并不灵活

方法2、状态变换表

一个例子:

当前状态 条件 状态转换
逃跑 安全 巡逻
攻击 比敌人弱 逃跑
巡逻 受到威胁并比敌人强 攻击
巡逻 受到威胁并比敌人弱 逃跑

表中的每个状态可以抽象为一个对象或者是一个函数,这个表会被智能体在规则的时间间隔内询问,这样做的话,状态的结构会更加的条理清晰,增加新的状态模块也会更加方便一些

方法3、内置的规则

例子:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class State
{public virtual void Execute(Player player){}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Runaway : State
{public override void Execute(Player player){if (player.isSafe){player.ChangeState(new Sleep());}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Sleep : State
{public override void Execute(Player player){if (player.isThreatened){player.ChangeState(new Runaway());}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Player : MonoBehaviour
{private State curState;public bool isSafe;//判断是否处于安全状态public bool isThreatened;//判断是否处于受威胁状态// Update is called once per framevoid Update(){if(curState != null){curState.Execute(this);}}public void ChangeState(State newState){curState = newState;}
}

state作为状态类的一个基类,拥有一个虚函数供子类重写,每当有一个新的状态,就继承state类,并重写Execute方法。player类里面执行的状态完全由curState的值来决定,这样的话,状态本身进行了封装并且在内部给出了影响状态变换的规则。

这个结构被称为状态设计模式,它提供了一种优雅的方式来实现状态驱动行为。它非常容易为每种状态增加进入状态和退出状态的动作,你只需要为每个状态创建Enter和Exit方法并相应的调整智能体的ChangeState方法即可。

《游戏人工智能编程》学习笔记二——简单的有限状态机相关推荐

  1. 《游戏人工智能》学习笔记

    复习笔记 chapter 1 游戏人工智能是人工智能科学技术领域的一个分支 人工智能游戏的研究内容是如何将人工智能的理论.方法和技术应用于开发智能游戏.提高游戏角色的智能水平,主要包括智能游戏角色的行 ...

  2. 网易云课堂微专业--Java高级开发工程师--多线程并发编程--学习笔记(二)

    文章目录 第一章 多线程并发编程 第二节 线程安全问题 1.2.1 线程安全之可见性问题 多线程中的问题 从内存结构到内存模型 工作内存缓存 指令重排序 内存模型的含义 Shared Variable ...

  3. Linux 网络编程学习笔记——二、IP 协议详解

    目录 一.IP 服务的特点 IP 协议为上层协议提供无状态.无连接.不可靠的服务: 无状态(stateless):指 IP 通信双方不同步传输数据的状态信息,因此所有 IP 数据报的发送.传输和接收都 ...

  4. Java并发编程学习笔记(二)多线程的理解及多线程的优点

    多线程的优点 原文:http://tutorials.jenkov.com/java-concurrency/benefits.html 作者:Jakob Jenkov        翻译:古圣昌   ...

  5. 《游戏人工智能》学习笔记1——4 行为选择算法一览

    思维导图 文字版 4 行为选择算法一览 AI模型:感知-思考-行动. 实现NPC思考的算法有很多种,每种算法都有适用的场景.本章介绍几种业界最流行的行为选择(思考)算法 注:思考,也是上面提到的行为选 ...

  6. 《游戏人工智能》学习笔记2——5 结构化架构:游戏AI开发的常用技巧

    思维导图 文字版: 5 结构化架构:游戏AI开发的常用技巧 本章目的 让读者对游戏AI的全局框架有充分的了解,并针对开发问题提供思路和解决方案 不会说深入具体方法和技术细节,这些内容可以参考文后文献资 ...

  7. C语言学习笔记(二): 简单的C程序设计

    数据的表现形式 常量 在C语言中常量有以下几种: 整型常量: 0,-1,100 实型常量: 小数形式(12.12):指数形式(12.1e3= 12.1 × 1 0 3 12.1\times 10^3 ...

  8. 2021-11-16派森编程学习笔记“上帝视角下的游戏操盘手” 通过类的继承学会了复用代码,减少代码冗余,提高编程效率。

    派森编程学习笔记"上帝视角下的游戏操盘手" [自学笔记] 继承 在Python中继承是指:在类的基础上,它可以实现现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩 ...

  9. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

最新文章

  1. 【VirtualBox】VirtualBox使用现有的虚拟盘文件(如VHD)创建虚拟机时,报错:打开虚拟硬盘失败,“UUID already exist”的解决方法
  2. 清华人工智能发展报告:过去十年中国AI专利申请量全球第一
  3. XML实现Android动画效果anim
  4. WPF 设置类库项目为启动项,设置窗体跟随。
  5. 石墨烯区块链(4)API
  6. 【转】3.4SharePoint服务器端对象模型 之 访问文件和文件夹(Part 4)
  7. 第一章 CLR执行模型
  8. python第一周作业--------模拟登录
  9. IOS Xcode7 http 和 https
  10. html3d电子相册,3d电子相册制作软件哪个好, 自带翻页电子相册模板,电子相册生成flash等多种格式...
  11. 百度地图坐标转换及跨域
  12. C语言中整形的大小和范围
  13. 【分析】编程和数学是什么关系?为什么编程学习这么火?
  14. 用注册表管理IE代理设置
  15. JAVA中phrase居左_mymail iText中用文本块(chunk)、短语(Phrase)和段 联合开发网 - pudn.com...
  16. 十万行代码——记我的ACM之路
  17. Qt学习笔记——获取本机网络信息(IP, 子网掩码, 广播地址,主机名
  18. 如何用W7100A实现串口转以太网
  19. 51单片机OLED收银电子秤称重计价清零去皮金额累计HX711
  20. 日历(NSCalendar)

热门文章

  1. 湖南师范大学沦为zeus放马站点
  2. 最强Android教程!阿里P7级别面试经验总结,成功拿下大厂offer
  3. 双 JK 触发器 74LS112 逻辑功能。真值表_数字电路学习笔记(七):经典组合逻辑器件(上)...
  4. 【Unity3D开发小游戏】专栏文章导读清单
  5. Aria2 GUI for Mac V1.3 极速版 百度网盘高速下载神器
  6. 图像到图像的映射(实验三)
  7. [Synthetic-data-with-text-and-image]
  8. Mondly怎么样,Mondly好用吗——Mondly使用评测+七折优惠购买+App Store退订
  9. 新书上市 | Vue 3.0 核心源码解析,这本书给Vue学习提供新方法
  10. 网页中常用的web安全字体