状态机实现

4

我正在尝试制作一个桌游...看起来必须使用状态机来实现。

我知道GoF中的状态模式,但我相信一定有其他实现状态机的方法。如果您知道任何包含不同实现细节(每种方法的权衡)的文章或书籍,请告诉我...谢谢


你确定状态机适用于棋盘游戏吗?对我来说似乎有些奇怪。 - starblue
1
你想要实现一个游戏服务器,还是为游戏编写一个电脑玩家?在第一种情况下,状态机是有意义的,而在第二种情况下则不太合适。 - wildplasser
4个回答

3

2
我们使用了Harel的状态图(类似于状态机但更容易理解),有一本好书叫做《C/C++实用状态图》。Practical Statecharts in C/C++

1
这是一个非常简单的有限状态机实现:

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);
    }
}

您可以按照以下方式使用它:
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);
    }
}

我猜那是C#?需要澄清一下是哪种语言(看起来不太像Java或C ++)。 - Jason S

0

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

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

一个示例框架可以在以下网址中看到:

http://www.StateSoft.org


请务必仔细阅读有关自我推广的常见问题解答。同时请注意,每次链接到您自己的网站/产品时都需要发布免责声明。 - j0k
看起来statesoft.org域名现在被停放了? - Stéphane Gourichon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接