有限状态机

有限状态机

你。 提交于 2019-12-07 16:21:27
  有限状态机是一种用来进行对象行为建模的工具,其主要作用是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种操作。   处理各种事件和状态切换,把业务模型抽象成一个有限状态机,那么代码就会逻辑特别清晰,结构规整。   状态机的 4 要素:1.现态 2.条件 3.动作 4.次态   1.现态:是指当前所处的状态   2.条件:又称事件,当一个条件被满足将会触发一个动作,或者执行一次状态迁移   3.动作:条件满足后执行的操作,动作执行完毕就迁移到新的状态,也可以保持现有状态。动作不是必须的,当条件满足,也可以       不执行任何动作,直接迁移到新的状态。   4.次态:次态是相对现态的,次态一旦被激活,就是新的现态了。   tips:   1.动作执行完毕,则结束,而状态是稳定的,没有外部条件的触发,则会一直保持下去。   2.如果状态划分时,漏掉一些状态,会导致跳转逻辑不完整。仅在指定的状态下,执行指定的事件才会发生动作的执行导致状态的迁移,否则不会发生状态的跳转。    来源: https://www.cnblogs.com/wust-hy/p/12002116.html

UML图画法

匿名 (未验证) 提交于 2019-12-03 00:37:01
最近开始学习设计模式,要想快速理解并掌握设计模式画UML图不失为一种行之有效的方法。以下是我所记的笔记。最后为原文链接.我画UML图所用的软件是一个在线软件 点击打开链接 。当然他也有离线版本,搜搜就能下到。 ************************************************************************************************************************* һ. 分为三层 第一层为类的名称,如果是抽象类,则用斜体表示。 当然这里我也用斜体表示虚方法。 **************************************************************************************************** 二.接口: 与类图的区别主要是顶端的<<interface>>显示。第一行是接口名称,第二行是接口方法。 Resouce上直接加载,有的是在AssetBundle上加载,有些是在其他位置加载。有些在本地,有些在网络上。 如果把他们全写在一起,不符合设计模式中的开闭原则。也就是对修改关闭,对扩展开放。 我们用对应的加载方法类实现这个接口,本地加载写一个类,网络加载写一个类,如果有新需求要在AssetBundle包上加载

有限状态机(FSM)写法的总结(一段式,二段式,三段式)

匿名 (未验证) 提交于 2019-12-02 23:26:52
一段式 :整个状态机写到 一个always模块 里面,在该模块中既描述状态转移,又描述状态的输入和输出; 二段式 :用 两个always模块 来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出; 三段式 :在两个always模块描述方法基础上,使用 三个always模块 ,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合 电路 输出,也可以时序电路输出)。 三段式状态机示例模板: //第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器 //异步复位 if(!rst_n) else //注意,使用的是非阻塞赋值 //第二个进程,组合逻辑always模块,描述状态转移条件判断 //电平触发,现存状态为敏感信号 begin case(current_state) //阻塞赋值 //阻塞赋值 ... endcase end //第三个进程,同步时序always模块,格式化描述次态寄存器输出 always @ (posedge clk or negedge rst_n) begin ...//初始化 case(next_state) //注意是非阻塞逻辑 /

有限状态机(FSM)设计原理

限于喜欢 提交于 2019-11-30 06:14:16
1 概述 2 状态机的描述方法 3 FSM的状态编码 4 FSM的Verilog HDL 设计的基本准则及有限状态机设计的一般步骤  基本准则  一般步骤 5 设计举例 51一段式one alwaysFSM 52 三段式three-alwaysFSM 53 总结 1.1 概述   有限状态机是由寄存器组和组合逻辑构成的硬件时序电路。有限状态机的状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。   有限状态机的下一个状态不但取决于各个输入值,还取决于当前所在状态。这里指的是米里Mealy型有限状态机,而莫尔Moore型有限状态机的下一个状态只决于当前状态。   图 1  Mealy型状态转移图 1.2 状态机的描述方法   状态机的描述方法多种多样,将整个状态机写到1个always 模块里,在该模块中既描述状态转移,又描述状态的输入和输出,这种写法一般被称为一段式FSM 描述方法;还有一种写法是使用两个always 模块,其中一个always 模块采用同步时序的方式描述状态转移,而另一个模块采用组合逻辑的方式判断状态转移条件,描述状态转移规律,这种写法被称为两段式FSM 描述方法;还有一种写法是在两段式描述方法的基础上发展而来的,这种写法使用3 个always模块,一个always 模块采用同步时序的方式描述状态转移

C#中的有限状态机

▼魔方 西西 提交于 2019-11-28 08:27:09
最近在做一些怪物AI,发现之前写的状态机维护性不是很优秀,自己稍微改动了一下 所谓有限状态机就是决定我们游戏对象的当前状态和状态间的切换,状态机最终只能指向一个结果,由这个结果指向这个状态的行为,也就是执行的函数 之前的状态机将所有的状态逻辑写到了状态类中,但是如果新添加逻辑需要回到状态中写,或者创建新的状态类,在代码的可读行上有点欠缺 而这次做出的改动的主要思想就是将状态中执行的逻辑和状态类进行一个分离,将状态中的逻辑单独封装成类,这个类写在对应的游戏对象所挂的脚本的文件中,这样就能在保正维护性的同时提高可读性 具体的写法如下 public class FsmCore //这个类是状态机的核心,是改变状态和调用状态对应函数的类 { public StateBase curState;//当前状态此类是一个抽象类 public StateBase prevState;//上一个状态 public StateDataBase curdata;//当前状态执行时需要的数据,此数据是一个抽象类 //更改状态方法 public void ChangeState(StateBase state,StateDataBase data)//这里两个参数分别是一个新状态和执行新状态需要的数据 { if (curState != null && curState.ID == state.ID)/

C语言实现简单有限状态机(FSM)

梦想与她 提交于 2019-11-27 02:23:01
文章目录 状态机-概述 实现方法 使用if/else if语句实现的FSM 使用switch case 函数指针实现FSM 参考 状态机-概述 有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。FSM是一种逻辑单元内部的一种高效编程方法,在服务器编程中,服务器可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。 实现方法 使用if/else if语句实现的FSM 使用if/else if语句是实现的FSM最简单最易懂的方法,我们只需要通过大量的if /else if语句来判断状态值来执行相应的逻辑处理。 看看下面的例子: #include <stdio.h> // // ┏┛ ┻━━━━━┛ ┻┓ // ┃       ┃ // ┃   ━   ┃ // ┃ ┳┛  ┗┳ ┃ // ┃       ┃ // ┃   ┻   ┃ // ┃       ┃ // ┗━┓   ┏━━━┛ // ┃   ┃ 神兽保佑 // ┃   ┃ 代码无BUG! // ┃   ┗━━━━━━━━━┓ // ┃        ┣┓ // ┃     ┏┛ // ┗━┓ ┓ ┏━━━┳ ┓ ┏━┛ // ┃ ┫ ┫ ┃ ┫ ┫ // ┗━┻━┛ ┗━┻━┛ enum Year