有限状态机的概念

一、有限状态机的概念

有限状态机简称状态机,是表示有限个状态,以及在状态之间的转移和动作等行为的数学模型。状态机的要素有状态状态转移两个。

在Unity中,动画状态机最重要的属性就是节点和连线,其中每个节点都是一个动画片段(或动画融合树),而没跟连线代表着可以从一个状态转移到另一个状态。

对动画来说,动画状态的转移是有条件的,一般是通过设定动画变量,使得动画播放完毕时能够跳转到另一个动画状态 。其他编程逻辑也是一样,总要设计出一些必要的状态,并定义状态之间的转移条件,才能把一个复杂的逻辑描述清楚。

1、状态机用于电子体重秤设计

 AI状态机既可以用于复杂逻辑也可以用于简单逻辑,此处先从一个简单的、不属于AI的例子开始——电子体重秤。

电子体重秤是一种常见的电子设备,一般不需要用按钮或遥控器操作,使用时人只需要站在上面,或者把需要称重的物体放在上面,保持几秒钟,很快就会在小屏幕上显示出测量的结果。

其工作流程是自动化的,背后也有一段程序控制其测量过程。如果用状态机的方法分析它,它应当具有几种状态?状态之间又是如何切换的呢?

根据使用流程分析出它的基本工作状态如下:

  1. 休眠状态
  2. 启动状态(初始化)
  3. 测量状态(数字会持续变化的状态)
  4. 锁定状态(数字不再变化的状态)

不再使用时会回到休眠状态,因此基本上只有以上几种工作状态。

其状态转移的条件如下:

  1. 在休眠状态下,如果感受到压力则启动
  2. 启动后立即进入测量状态
  3. 在测量状态下,持续测量并显示当前重量值。如果重量在几秒内没有变化,进入锁定模式
  4. 锁定状态,显示测量结果,数字闪烁 提示。在锁定状态下一段时间后压力不变则进入休眠状态;如果压力大幅变化则再次进入测量状态

将以上描述化成状态转移图,如图:

 以上状态转移图是根据观察分析得出的结论,其他电子体重秤的逻辑可能有所不同。但重要的是,可以设想集中常规和非常规使用场景,去分析和测试是否存在设计漏洞,如以下设想。

  1. 在锁定后离开体重秤。体重秤发现压力大幅降低,切换到测量状态,然后再次进入锁定状态。
  2. 在测量未结束时离开体重秤。测量值变为0,一段时间后进入测量状态。
  3. 锁定时再加上一些重物。体重秤发现重量变化,再次进入测量状态。

还可以举出很多像这样的测试例子。经过推演发现,很多特殊行为都会转移到锁定状态,逻辑上没有明显漏洞。在设计上未发现错误的状态机就可以考虑用代码实现了,细节问题可以在功能实现后进一步测试。

2、状态机用于游戏逻辑设计

某些看似简单的游戏,实际编写的代码并不简单。例如,经典的电子游戏俄罗斯方块,用编程实现它对于初学者来说相当具有挑战性。

就俄罗斯方块来说,游戏中有一些逻辑并不是显而易见的。例如按方向键的时候如何处理?从表面上看,按下方向键时正在下落的方块应当左右移动,但是如果进一步分析什么时候会出现正在下落的方块,就会发现有方块下落的状态仅仅是多个游戏状态中的一种。

俄罗斯方块的游戏流程,至少分为生成方块、方块下落、方块固定、消除整行方块、游戏结束5种状态,其中只有方块下落状态是受玩家控制的,其他状态都不用考虑玩家的输入。从状态机的角度考虑,游戏逻辑会变得十分清晰,如图:

编写逻辑时,代码中有一个关键变量——CurrentState(当前状态)。代码按照状态分成5部分,每一帧格局当前状态执行其中的一部分,满足某条件时修改当前状态,影响下一帧执行的逻辑。

严格按照这种思路编写代码,就可以避免大量的条件判断,让代码变得清晰,从而减少出错的可能性。

3、状态机应用于游戏AI设计

现代的很多游戏中都有一些具备简单智能的敌人,特别是潜行类游戏,例如在《细胞分裂》等游戏中,具有一定智能的敌人是游戏设计的核心,也是让玩家乐此不疲、不断挑战的动力。

以下是几个例子:

  1. 敌人AI:在一个射击游戏中,敌人的行为可以由状态机控制。比如,当敌人处于"巡逻"状态时,它会在指定区域内来回移动;当敌人检测到玩家进入其感知范围时,它会切换到"追逐"状态并开始追击玩家;当敌人受到攻击并生命值降低时,它可能会切换到"逃跑"状态以寻找掩体或者呼叫援助。

  2. 玩家角色AI:在一个角色扮演游戏中,玩家角色的行为也可以由状态机来控制。比如,当玩家角色处于"探索"状态时,它会自由地在游戏世界中移动和探索;当玩家角色进入战斗时,它会切换到"攻击"状态并执行攻击动作;当玩家角色生命值过低时,它可能会切换到"撤退"状态以避免被击败。

  3. NPC角色AI:在一个角色扮演游戏或者生存游戏中,非玩家角色(NPC)的行为也可以利用状态机来设计。比如,一个NPC农民的状态机可以包括"种田"、“收割”、"出售农产品"等状态,根据当前的任务和条件来决定下一个动作。

这只是状态机在游戏AI设计中的一些简单应用举例,实际上,状态机可以处理更加复杂的行为和决策流程,从而使游戏角色的行为更加智能、有趣和逼真。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127468.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Emscripten安装并配置环境变量

前言 Emscripten官网 官网有安装教程,但有些细节没有讲清楚,本文会很详细的讲解每一步。 一、下载 emsdk 包 emsdk – github地址 可以使用 git 去拉取,不过可能会超时拉取失败。 git clone https://github.com/emscripten-core/emsdk.…

数据结构与算法-队列

一.队列的基本概述 1.队列的定义 答:队列是现在在两端进行插入和删除操作的线性表,"队尾"是允许进行存入…

系统软件启动过程

实验一:系统软件启动过程 参考 重要文件 调用顺序 1. boot/bootasm.S | bootasm.asm(修改了名字,以便于彩色显示)a. 开启A20 16位地址线 实现 20位地址访问 芯片版本兼容通过写 键盘控制器8042 的 64h端口 与 60h端口。b.…

ApachePulsar原理解析与应用实践(学习笔记一)

随着时代的发展,软件设计的理念也在不断发展,从单体服务、面向服务、微服务,发展到云原生以及无服务。其演变的过程是一个能力不断增强,领域边界不断微分细化的过程。比如无服务就是将函数作为服务,就类似dns模式的服务…

什么是50ETF期权开户条件,怎么开期权交易权限?

50ETF期权是指上证50ETF期权,标的物是上证50ETF,代码是(510500),期权是一种在上证50ETF基础上进行衍生品交易的金融工具,下文科普什么是50ETF期权开户条件,怎么开期权交易权限?本文来…

死锁

目录 什么是死锁 产生的条件 死锁避免 银行家算法 问题引入 银行家算法的实现思想 死锁检测 每种类型一个资源的死锁检测 每种类型多个资源的死锁检测 死锁恢复 鸵鸟算法 什么是死锁 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线…

3.3.2 【MySQL】客户端和服务器通信中的字符集

3.3.2.1 编码和解码使用的字符集不一致的后果 我们知道字符 我 在 utf8 字符集编码下的字节串长这样: 0xE68891 ,如果一个程序把这个字节串发送到另一个程序里,另一个程序用不同的字符集去解码这个字节串,假设使用的是 gbk 字符集…

3ds max插件CG MAGIC中的室外功能可以高效出图吗?

使用3ds Max高效出图秘诀有没有什么秘诀呢?如何做到快速出图呢? 3ds max插件CG MAGIC中的室外功能可以高效出图吗? CG MAGIC 是一款基于3DS max深入开发的智能辅助设计插件。 自从CG Magic专业版上线之后,小伙伴们对新功能诀窍…

Java中如何进行加锁??

笔者在上篇文章介绍了线程安全的问题,接下来本篇文章就是来讲解如何避免线程安全问题~~ 前言:创建两个线程,每个线程都实现对同一个变量count各自自增5W次,我们来看一下代码: class Counter{private int count0;publi…

数学的魅力

数学的魅力 数学的历史古代数学古希腊数学中世纪数学文艺复兴数学 数学的分支1. 代数学2. 几何学3. 微积分学4. 概率论与统计学5. 数论 数学的重要性1. 科学和技术2. 经济学和金融3. 医学和生物学4. 社会科学5. 环境科学 数学的未来1. 人工智能2. 网络安全3. 空间探索 结论 数学…

docker-compose安装nginx

基于docker-compose安装nginx 目录 一、目录结构 1、docker-compose.yml 2、nginx.conf 3、default.conf 4、index.html 二、访问测试 一、目录结构 1、docker-compose.yml version: 3 services:nginx:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/nginx:1.21.1…

单向链表(c/c++)

链表是一种常见的数据结构,其中运用到了结构体指针,链表可以实现动态存储分配,换而言之,链表是一个功能强大的数组,可以在某个节点定义多种数据类型,可以实现任意的添加,删除,插入节…

使用JS实现一个简单的观察者模式(Observer)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 手撸Observer⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领…

2023国赛数学建模E题思路代码 黄河水沙监测数据分析

E题最大的难度是数据处理,可以做一个假设,假设一定时间内流量跟含沙量不变,那么我们可以对数据进行向下填充,把所有的数据进行合并之后可以对其进行展开特性分析,在研究调水调沙的实际效果时,可以先通过分析…

linux下shell脚本实现wordpress搭建

wordpress_auto_install.sh #!/bin/bashuser$(whoami)function wordpress_auto_install () { if [ $user "root" ];thenecho "前提:调整系统配置,如关闭selinux、firewall等!"sed -i s/SELINUXenforcing/SELINUXdis…

baichuan2(百川2)本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Web开发后端总结

Web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器层 - 负责接收请求响应数据,Service - 业务层负责具体的业务逻辑处理,而Dao - 数据访问层也叫持久层,就是用来处理数据访问操…

认识异常【超详细】

文章目录 1. 异常的概念与体系结构1.1 异常的概念1.2 异常的体系结构1.3 异常的分类1. 编译时异常2. 运行时异常 2. 异常的处理2.1 防御式编程2.2 异常的抛出2.3 异常的捕获2.3.1 异常声明throws2.3.2 try-catch捕获并处理2.3.3 finally 2.4 异常的处理流程 3. 自定义异常类 1.…

win10 任务栏预览设置为列表效果

背景 在win10系统,当同一个应用(如文件资源管理器,git bash,word等)打开多个页面时,当个数少于17(大约)个时,其默认预览效果为平铺,在大于17个时&#xff0c…

Spring与Docker:如何容器化你的Spring应用

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…