2010-02-18 42 views
0

我试图让我的周围如何设计以下系统,我认为可以定义为一个有限状态机头:如何设计这个特定的有限状态机?

假设我们有一堆16积木(塔楼,城墙,城门)一起形成一座城堡。玩家可以将这些积木拖到平面图上的16个地方,如果完成得当,他们会看到整个城堡。所有的塔楼(其中有四个塔楼)是相同的,所以它们可以在四个角落中的任何一个上。一些墙壁也是如此。

总的来说,在平面图上有16个点,你可以放置一个积木,每个点可以有17个“状态”:空的+ 16个积木块中的任何一个。做一些数学这导致17^16 =很多组合。

程序从一个空的平面图和一堆积木开始。然后它应该显示一条信息,比如“建造自己的城堡,从塔楼开始”。当用户正确地放置一个塔时,应该说“做得好,现在建造所有四个塔”。你明白了。

问题是:玩家可以做很多事情。把一个块放在错误的地方,删除一个块,正确地把墙或塔在整个布局图上,忽略给他们的指示等。

如果我可以避免使用数千个if-then声明来决定我是否应该采取下一步,显示错误消息或根据玩家的行为回到上一步。

您会如何描述建筑顺序每一步的NEXT,PREVIOUS和ERROR条件?有没有任何设计方法?非常感谢您的意见。

+0

相关:http://stackoverflow.com/questions/1647631/c-state-machine-design – jldupont 2010-02-18 14:26:53

+0

每个“布局图上的斑点”是否只允许一个块类型(例如墙)? – 2010-02-18 14:37:02

+0

@审判:是的,它的确如此。然而,有四座塔完全相同,所以他们可以去城堡的四个角落。但是他们不应该去墙壁预期的地方,墙壁不应该被建立在预计塔的地方。 – Droozle 2010-02-18 16:48:23

回答

0

尝试以声明方式做到这一点。定义一个描述块类型的枚举(或可能是类)。定义并构造一个4x4二维数组,描述每个位置允许的块类型集合(将这些集合实现为列表,位域,任何最适合的类型)。无论何时玩家试图将某个模块放置在某个位置,检查是否允许使用2D数组。如果你想要正确填入某个位置的特定消息,也可以将它们放在同一个数组中。

我不知道FSM是否真的是你以后的事情:你想验证什么样的序列约束?塔是否首先建造是否重要?从您的其他描述中,听起来上面的目标状态描述会更合适。

+0

感谢您的回复。我一直在和另一位程序员讨论这个问题,他也谈到了位字段。但在这种情况下,我们希望玩家遵循一个固定的建筑顺序(这是一个教育计划),同时仍然允许他们围绕他们认为合适的方式移动块。 – Droozle 2010-02-18 16:49:21

+0

在阅读了关于状态机的更多内容之后,我确实认为这正是使用FSM可以解决的问题。到目前为止,我已经能够推导出: - 我有16个输入(平面图上的点) - 每个输入只有3个状态:空,正确,错误 - 建筑物的当前状态用作另一个输入 - 我需要定义进入下一状态的条件 - 我需要定义一个条件返回到以前的状态 - 我需要定义一个条件,使机器保持其当前状态(不会是难,嘿嘿) – Droozle 2010-02-18 16:49:50

+0

- 如果上述条件都不符合,我可以警告玩家修改他的策略,或者我可以试着找出当前情况属于哪个状态并跳到那里(但那可能会违反FSM设计原则,我猜)。 – Droozle 2010-02-18 16:50:24