package fsm

import (
"log"
) type EvtIf interface {
GetEvtType() string
} type Action interface {
//doAction(evt EvtIf, srcState *State, dstState *State)
doAction(evt EvtIf)
} type Transition struct {
dstState *State
action Action
} type State struct {
name string
isEnd bool
transitionTbl map[string]Transition
} type fsm struct {
InstId uint64
version uint32
startPoint *State
current *State
transitionLog []Transition
stateTbl map[string]*State
} //func StartStateMachine(transtionLog []Transition) *fsm {
//}
//func ReplyStateMachine(transtionLog []Transition) *fsm {
//}
//func Save() *fsm {
//}
//func Load() *fms {
//} func NewState(name string, end bool) *State {
return &State{name, end, map[string]Transition{}}
} func (this *State) GetName() string {
return this.name
} func (this *State) InterestInEvt(evt EvtIf) bool {
if evt == nil {
return false
}
_, exists := this.transitionTbl[evt.GetEvtType()]
return exists
} func (this *State) AddTransition(evt EvtIf, dst *State, action Action) {
if evt == nil || dst == nil || action == nil {
log.Fatal("AddTransition error, parameter invalid!")
}
_, exists := this.transitionTbl[evt.GetEvtType()]
if exists {
log.Fatal("AddTransition error,EvtIf exist")
}
this.transitionTbl[evt.GetEvtType()] = NewTransition(dst, action)
} func (this *State) GetTransition(evt EvtIf) *Transition {
if evt == nil {
return nil
} tran, exists := this.transitionTbl[evt.GetEvtType()]
if exists == false {
log.Fatal("GetTransition error,EvtIf doesn't exist")
}
return &tran
} func NewTransition(dstState *State, action Action) Transition {
return Transition{dstState, action}
} func (this *fsm) RegisterState(state *State) {
if state == nil {
log.Fatal("RegisterState error, parameter invalid!")
}
_, exists := this.stateTbl[state.GetName()]
if exists {
return
log.Fatal("RegisterState error,State exist")
}
this.stateTbl[state.GetName()] = state
} func (this *fsm) AddTransition(srcState *State, evt EvtIf, dstState *State, action Action) {
if srcState == nil || dstState == nil || evt == nil || action == nil {
log.Fatal("AddTransition error, parameter invalid!")
}
this.RegisterState(srcState)
this.RegisterState(dstState)
srcState.AddTransition(evt, dstState, action)
} func (this *fsm) AddInternalTransition(srcState *State, evt EvtIf, action Action) {
this.AddTransition(srcState, evt, srcState, action)
} func (this *fsm) HandleEvt(evt EvtIf) {
if evt == nil {
return
} srcState := this.current
if srcState.InterestInEvt(evt) {
transition := srcState.GetTransition(evt)
log.Printf("Handle Event, srcState:%s, dstState:%s, evt:%s", srcState.GetName(), transition.dstState.GetName(), evt.GetEvtType())
//transition.action.doAction(evt, srcState, transition.dstState)
transition.action.doAction(evt)
this.current = transition.dstState
} else {
log.Printf("parameter invalid, srcState:%s, evt:%s", srcState.GetName(), evt.GetEvtType())
}
} func NewFsm(initialState *State) *fsm {
if initialState == nil {
log.Fatal("NewFsm error, parameter invalid!")
}
return &fsm{initialState, map[string]*State{}}
}

Go fsm的更多相关文章

  1. 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack

    因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...

  2. FSM(状态机)、HFSM(分层状态机)、BT(行为树)的区别

    游戏人工智能AI中最常听见的就是这三个词拉: FSM 这个不用说拉,百度一大堆解释, 简单将就是将游戏AI行为分为一个一个的状态,状态与状态之间的过渡通过事件的触发来形成. 比如士兵的行为有“巡逻”, ...

  3. 有限状态机(FSM)

    在游戏开发中,AI是个永恒不变的话题,如果你要的AI只是很简单的一个逻辑 那么有限状态机是一个很好的解决方案,尽管在实际开发中,AI的设计并不是一个简单的逻辑, 如果用有限状态机,维护起来会非常麻烦, ...

  4. FSM 浅谈

    之前写过一篇关于状态机的,上一篇讲过的我也就不再罗嗦了,不知道欢迎去查看我的上一篇随笔,主要是感觉上次自己封装的还是不行,所以又进行修改了一番! 我本人是个菜鸟,最开始接触状态机的时候,状态机一个可厉 ...

  5. Atitit.java expression fsm 表达式词法分析引擎 v2 qaa.docx

    Atitit.java expression fsm 表达式词法分析引擎 v2 qaa.docx C:\0workspace\AtiPlatf_cms\src\com\attilax\fsm\Java ...

  6. 实现简易而强大的游戏AI——FSM,有限状态机

    http://blog.friskit.me/2012/05/introduction-of-fsm/ 在很久很久以前,受限于计算机性能和图形效果,游戏往往是以玩家为唯一主动对象的,玩家发出动作,游戏 ...

  7. Atitit.java expression fsm 表达式分词fsm引擎

    Atitit.java expression fsm 表达式分词fsm引擎 C:\0workspace\AtiPlatf_cms\src\com\attilax\fsm\JavaExpFsm.java ...

  8. FSM

    一.状态机简单介绍 软件设计中的状态机概念,一般是指有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和 ...

  9. FSM, VISIBILITY MAP AND VACUUM

    Update: Heikki’s slides are here! Heikki Linnakangas gave a presentation this past Sunday at FOSDEM  ...

  10. 二、有限状态机(FSM)

    1.状态机的作用?是什么? 状态机,顾名思义就是用来描述状态的.完善一点就是在同一的时钟下.更准确说是一种verilogHDL编程思想. 例如我们每一个系统都可以分为好几种状态,如:开始,初始化,运行 ...

随机推荐

  1. LeetCode(3)Longest Substring Without Repeating Characters

    题目: Given a string, find the length of the longest substring without repeating characters. For examp ...

  2. 组队赛Day1第一场 GYM 101350A - Sherlock Bones (DP)

    [题意] 给你一个01串.f(i,j)定义为区间[i,j]内1的个数,求区间 [i,j,k] 中 f(i,j) =f(j,k) 的情况的子串总数,要求str[j]=='1'. (题意描述引自Ilook ...

  3. JQuery基本事件函数

    1,click单击事件 2,blur失去光标事件,focus获得光标事件 3,JQuery.on()函数:为html元素绑定事件,如下代码: $("div").on("c ...

  4. BZOJ 1831: [AHOI2008]逆序对

    题目大意: 给出一个序列,有几个位置上的数字任意.求最小的逆序对数. 题解: 自己决定放置的数一定是单调不降的.不然把任意两个交换一下就能证明一定会增加逆序对. 然后就可以DP了,f[i][j]表示第 ...

  5. js php 互调

    1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <! DOCTYPE HTML><html><head&g ...

  6. 正负无穷float('inf')的一些用法

    Python中可以用如下方式表示正负无穷: float("inf"), float("-inf") 利用 inf 做简单加.乘算术运算仍会得到 inf > ...

  7. BZOJ 1008: [HNOI2008]越狱【组合】

    很少有的思路秒解.题意可以描述成对长度为n的格子有m种染色方案,问存在相邻两个格子同色的方案数,正难则反易,考虑问题的背面任意两个相邻的格子都不同色,第一个格子可以涂任意一种颜色m种可能,剩下的n-1 ...

  8. hihoCoder1381 - Little Y's Tree

    Portal Description 给出一个\(n(n\leq10^5)\)个点的带边权的树.进行\(Q\)次询问:每次删除树上的\(k\)条边,求剩下的\(k+1\)个连通块中最远点对距离的和.\ ...

  9. mark一下。hadoop分布式系统搭建

    用于测试,我用4台虚拟机搭建成了hadoop结构 我用了两个台式机.一个xp系统,一个win7系统.每台电脑装两个虚拟机,要不然内存就满了. 1.安装虚拟机环境 Vmware,收费产品,占内存较大. ...

  10. LA 4728 旋转卡壳算法求凸包的最大直径

    #include<iostream> #include<cstdio> #include<cmath> #include<vector> #includ ...