有限状态机的概念

news2024/11/26 2:53:12

一、有限状态机的概念

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

在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.coloradmin.cn/o/993351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zotero的使用教程

1. zotero安装 1.1 下载 官网下载地址:Zotero 1.2 安装 建议自定义安装路径,不要安装在C盘。如以下步骤: 2. 插件安装 一般安装以下四种插件,即茉莉花(Jasminum)、zotfile、zotero-scihub、zotero-pdf-translate。以安装茉莉花插件为例进行说明,如图1所示,其余插件安…

Linux mac Windows三系统 局域网文件共享方法

主要工具: Samba是一个开源的软件套件,允许Linux系统与Windows系统之间共享文件和打印机。 一、首先是Linux共享的设置 ①安装 sudo apt-get install samba ②创建共享文件夹 sudo mkdir /home/share ③配置用户 sudo smbpasswd -a kequan ④修改…

软件测评的必要性,第三方软件测试机构推荐

软件测评报告 1、什么是软件测评报告? 测试报告是指把测试的过程和结果写成文档,对发现的问题和缺陷进行分析,为纠正软件的存在的质量问题提供依据,同时为软件验收和交付打下基础。 2、软件测评报告的作用 一份详细的测试报告…

git打tag和版本控制规范

我们在开发中经常会遇到要打tag的情况,但这个tag应该如何打呢?我不知道大家平时是怎么打的,但我基本就是从1.0.0开始进行往上递增,至于如何递增,基本凭感觉。今天同事新打了一个tag进行发版,然后被架构点名…

计算机竞赛 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

AJAX学习总结+Axios异步框架+Filter拦截器学习+JSON介绍+Listener监听器介绍

壹、AJAX 一、AJAX介绍 AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XML AJAX作用: 1. 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据。(原先…

过于依赖性的危机:探索品牌代理商背后的实质含义

据IDC中国报道称:2023年中国低代码与零代码软件市场规模将达到34.7亿元人民币,同比增长32.4%。预计到2027年市场规模将达到106.3亿元人民币,未来5年市场年复合增长率(CAGR)为32.3%。 随低代码市场规模不断扩大&#xf…

【计算机网络】 确认应答机制与超时重传

文章目录 ACK机制——确认应答机制超时重传 ACK机制——确认应答机制 当我们客户端发送了一个数据,seq是1100,那么服务端在收到时就会回一个ack101的ACK包,代表101之前的包我都收到了,下面请你从101继续发送。然后客户端就会发送1…

无涯教程-JavaScript - IMARGUMENT函数

描述 IMARGUMENT函数返回参数$\theta $(theta),以弧度表示的Angular,如- $$x yi \left | x yi \right | e ^ {i \theta} \left | x yi \right |(\cos \theta \sin \theta)$$ 语法 IMARGUMENT (inumber)争论 Argument描述Required/OptionalInumberA complex number f…

【C++基础】7. 控制语句

文章目录 【 1. 循环 】1.1 循环类型1.2 循环控制语句break 语句continue 语句goto 语句 1.3 无限循环 【 2. 选择 】switch 语句?:语句 【 1. 循环 】 1.1 循环类型 循环类型描述while 循环当给定条件为真时,重复语句或语句组。它会在执行…

floodfill算法(洪水灌溉算法)

一)floodfill算法简介: 二)图像渲染 733. 图像渲染 - 力扣(LeetCode) class Solution {int[] dx {1, 0, 0, -1};int[] dy {0, 1, -1, 0};//上下搜索的时候要使用向量数组int row0;int col0;int target0;public void dfs(int[][] image,int i,int j,int…

认识模块化

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组 合、分解和更换的单元。 1. 现实生活中的模块化 2.编程领域中的模块化 编程领域中的模块化,…

教你如何快速阅读葡萄酒标签

我们经常被问及葡萄酒标签上写了什么,总体而言这些信息可以分为四个关键部分,第一品牌或生产商;第二国家或地区;第三葡萄品种;第四年份。 第一品牌或生产商,在寻找葡萄酒的制造商时,著名的品牌名…

手机充值的功能测试框架 - 测试要点

手机充值有微信营销活动的、有 APP 页面应用等,以下是我以前公司的手机充值话费或流量应用的测试要点,分享给大家参考下。 一、手机号码输入框检查 1、手机号码框要控制成只能输入11位数字的文本框。 2、输入以非1开头的手机号,给出提示&a…

第 2 章 线性表 (设立尾指针的单循环链表(链式存储结构)实现)

1. 背景说明 循环链表(circular linked list),是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点, 整个链表形成一个环。由此,从表中任一结点出发均可找到表中其他结点 。 2. 示例代码 1) status.h /* DataStruct…

Parsing error: The keyword ‘const‘ is reserved

Parsing error: The keyword ‘const’ is reserved 在文件.eslintrc.js中 因为eslint默认审查的es5,需要明确让他审查es6.,所以需要配置parserOptions 配置如下: module.exports {"plugins": ["prettier"],"rules": {…

【自学开发之旅】Flask-标准化返回-连接数据库-分表-orm-migrate-增删改查(三)

业务逻辑不能用http状态码判断,应该有自己的逻辑判断。想要前端需要判断(好多if…else),所以需要标准化,标准化返回。 json标准化返回: 最外面:data,message,code三个字段。 data:返回的数据 co…

【Unity基础】2.网格材质贴图与资源打包

【Unity基础】2.网格材质贴图与资源打包 大家好,我是Lampard~~ 欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢 (一)网格材质纹理 第一次接触3D物体的话,会觉得好神奇啊,这个物体究竟是由什么组…

教育志愿者的初心与担当

近日,有报道显示,在全球范围内,大约有6000万的儿童由于各种原因无法接受基础教育,其中非洲大陆的教育贫瘠现象尤为显著。然而,在这片土地上,有一位中国年轻志愿者Lily Zhu,以一种富有创新精神的…

Mysql中in和exists的区别 not in、not exists、left join的相互转换

文章目录 1. in 介绍1.1 in中数据量的限制1.2 null值不参与in或not in,也就是说in and not in 并不是全量值,排除了null值1.3 in的执行逻辑 2. exists介绍2.1 exists not exists 是全量数据2.2 exists的执行逻辑 3. 小表驱动大表的好处4. in、not in、e…