赵丽红的空间

我们一直在努力....

状态机是个好东西

标签: 状态机 改变

状态机是个好东西,用好了会终身受益, 用上了也会爱不释手的啊。

关于状态机的一个季度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前”节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态,状态机停止。

比如控制一扇门的运动, 初始时门是关的, 当有力作用在门上时, 门开始慢慢打开,力的作用完后,门渐渐停止不动, 当有反向的力时,门又渐渐关上, 知道回到初始关的状态。 这个你会怎么来编程实现呢。 似乎很麻烦, 的确,没有状态机的思想时会很烦,设很多标志,一堆if条件。。
用状态机的话,不只是代码更清晰, 关键是更符合逻辑和自然规律, 不同状态不同处理, 满足条件则跳转到相关状态。
伪码如下:
enum
{
 CLOSED, // 关上状态
 CLOSING, // 正在关状态
 OPENED, // 打开状态
 OPENING, // 正在开的状态
}doorState = CLOSED; // 初始为关

Update()
{
 switch(doorState)
 case CLOSED:
 if (有人推门)
 doorState = OPENING; // 跳转到正在开状态
 break;
 case OPENING:
 door.Rotation += DeltaAngle; // 门的旋转量递增
 if (门的速度为零) / / 力的作用已去
 doorState = OPENED; // 跳转到开状态
 break;
 case OPENED:
 if (有人关门)
 doorState = CLOSING;
 break;
 case CLOSING:
 door.Rotation -= DeltaAngle; // 门的旋转量递减
 if (门的旋转角度减为零)
 doorState = CLOSED; // 门已关上
 break;
}

// 而绘制代码几乎不用怎么变, 门就是会严格按照状态机的指示去运动, 该停就会停
Render()
{
 RotateView(door.Rotation);
 DrawDoor(door.Position);
}

到底什么是状态机, 总结为一句话, 就是指定系统的所有可能的状态及状态间跳转的条件, 然后设一个初始状态输入给这台机器, 机器就会自动运转,或最后处于终止状态, 或在某一状态不断循环。

我们的M2系统将统一用状态机改变单据的状态,实现统一口径修改状态

 


    评分: 请先登录再投票,同一篇博客一月只能投票一次!
    无人投票

评论


发表评论

关注此文的人们还关注