Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 状态机实现_Design Patterns_State Machine - Fatal编程技术网

Design patterns 状态机实现

Design patterns 状态机实现,design-patterns,state-machine,Design Patterns,State Machine,我正在尝试建立一个棋盘游戏。。。看起来它必须使用状态机来实现 我从GoF知道,但我确信一定有其他方法来实现状态机。请让我知道。。如果您知道任何文章或书籍包含关于不同实现的详细信息(每种实现的权衡),请直接告诉我。。谢谢以下是一个非常简单的FSM实现: public delegate void ProcessEvent<TEvent>(TEvent ev); public abstract class StateMachine<TEvent> { private

我正在尝试建立一个棋盘游戏。。。看起来它必须使用状态机来实现


我从GoF知道,但我确信一定有其他方法来实现状态机。请让我知道。。如果您知道任何文章或书籍包含关于不同实现的详细信息(每种实现的权衡),请直接告诉我。。谢谢

以下是一个非常简单的FSM实现:

public delegate void ProcessEvent<TEvent>(TEvent ev);

public abstract class StateMachine<TEvent>
{
    private ProcessEvent<TEvent> state;

    protected ProcessEvent<TEvent> State
    {
        get { return this.state; }
        set { this.state = value; }
    }

    public void ProcessEvent(TEvent ev)
    {
        this.state(ev);
    }
}
公共委托无效处理事件(TEvent ev);
公共抽象类状态机
{
私有事件状态;
受保护的ProcessEvent状态
{
获取{返回this.state;}
设置{this.state=value;}
}
公共无效处理事件(TEvent ev)
{
本州(ev);
}
}
您将按如下方式使用它:

public class MyFsm : StateMachine<byte>
{
    public MyFsm()
    {
        this.State = this.Started;
    }

    private void Started(byte ev)
    {
        Console.WriteLine(ev);

        if (ev == 255)
        {
            this.State = this.Stopped;
        }
    }

    private void Stopped(byte ev) { }
}

class Program
{
    static void Main(string[] args)
    {
        MyFsm fsm = new MyFsm();
        fsm.ProcessEvent((byte) 0);
        fsm.ProcessEvent((byte) 255);
        fsm.ProcessEvent((byte) 0);
    }
}
公共类MyFsm:StateMachine
{
公共多年筹资机制()
{
this.State=this.Started;
}
私有无效已启动(字节ev)
{
控制台写入线(ev);
如果(ev==255)
{
this.State=this.Stopped;
}
}
私有无效已停止(字节ev){}
}
班级计划
{
静态void Main(字符串[]参数)
{
MyFsm fsm=新的MyFsm();
fsm.ProcessEvent((字节)0);
fsm.ProcessEvent((字节)255);
fsm.ProcessEvent((字节)0);
}
}

请查看。

我们使用了哈雷尔的状态图(类似于/相当于状态机,但更容易思考),有一本好书叫做。

有限状态机提供了实现所有事件驱动的游戏的最佳平台

由于您的目标是构建状态机,因此可以使用现有框架,而只需添加事件提取器和操作

一个示例框架见:


您确定状态机适合棋盘游戏吗?对我来说似乎很奇怪。你想实现一个游戏服务器,还是一个游戏的电脑播放器?在第一种情况下,状态机是有意义的,而在第二种情况下,它就没有那么有意义了?这将有助于澄清哪种语言(看起来不像Java或C++),请务必仔细阅读。另外请注意,每次链接到自己的站点/产品时,都需要发布免责声明。看起来statesoft.org域现在已停止?