2010-02-18 43 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