程式中有限狀態機自動機實現邏輯簡化

2021-05-25 18:25:34 字數 1855 閱讀 5028

/********************有限狀態機自動機***********************/

狀態圖--乙個圖的資料結構!

1.while + switch;

2.狀態機:就是指定系統的所有可能的狀態及狀態間跳轉的條件,然後設乙個初始狀態輸入給這台機器,機器就會自動運轉,或最後處於終止狀態,或在某乙個狀態不斷迴圈。

遊戲中狀態切換是很頻繁的。 可能以前要切換狀態就是if~else,或者設標誌,但這些都不太結構化, 如果把它嚴格的設為一種標準的狀態機,會清楚的多。

比如控制一扇門的運動, 初始時門是關的, 當有力作用在門上時,門開始慢慢開啟,力的作用完後,門漸漸停止不動, 當有反向的力時,門又漸漸關上, 知道回到初始關的狀態。 這個你會怎麼來程式設計實現呢。似乎很麻煩, 的確,沒有狀態機的思想時會很煩,設很多標誌,一堆if條件。

用狀態機的話,不只是**更清晰, 關鍵是更符合邏輯和自然規律, 不同狀態不同處理, 滿足條件則跳轉到相關狀態。

偽碼如下:

enum

doorstate = closed; // 初始為關

update()

// 而繪製**幾乎不用怎麼變, 門就是會嚴格按照狀態機的指示去運動, 該停就會停

render()

這是乙個簡單但很典型的例子, 狀態機的應用太多了。

就說乙個基本遊戲的運** (用到了乙個狀態然後還有子狀態)

updategame()

begin;

switch(gamestate)

case 等待選擇選單: //它有三個子狀態。

if (選擇選單項 == 開始)

if (選擇選單項 == 選項)

gamestate = 設定

if (選擇選單項 == 退出)

gamestate = 退出

case 開始:

遊戲執行;

if (使用者按退出鍵)

gamestate = 等待選擇選單 ;

...其他的狀態跳轉處理;

case 退出:

釋放資源;

退出;case 設定:

分別處理不同的選項, 跳轉不同的子狀態;

case .... // 其他狀態的處理

end;

某乙個狀態可以包含更多的子狀態, 這樣最好是同一層次的狀態設為乙個列舉, 並分到另乙個switch處理

如 enum states; state2又包含若干狀態

則再定義enum sub_state2;

想很多基本的渲染效果, 如淡入淡出, 閃爍等等, 用狀態的思想會事半功倍, 思路也更清晰。

其實像opengl, direct3d這樣的渲染引擎本身就是狀態機, 當你設定渲染的狀態, 這台機器就保持這個狀態進行渲染工作,如保持光照位置,保持片元顏色, 直到你再次改變它的狀態。

狀態機的應用實在太廣, 相關理論也很多, 最近上課學的隨機過程裡也講到一些, 數位電路裡的時序邏輯器件也是用狀態機來描述。 這些不必多說了。

總之, 用狀態機的角度去看待問題, 往往能把比較複雜的系統分解為能單獨處理的眾多子狀態, 處理也會得心應手。希望大家多用它, 很好的東西。

個人感覺狀態機的幾個不同實現階段:

1、switch/case 最原始的實現方式,是很多的c程式設計師習慣採用的方式。

2、查詢表[狀態、事件、動作],稍微做了一點改進。有點類似mfc的雛形。

3、在以上基礎上做的一些改進或者變體。

[比如用乙個棧結構,啟用的狀態位於棧頂,自動的對映事件和動作的對應,再或者通過一些巧妙的巨集等手段進行包裝。但是線性結構在實際中使用比較受限、過於技巧性的巨集比較難於理解...]

4、物件導向的設計下、靈活運用模式。如上面給出的鏈結。重用性和靈活性方面都有不錯的表現。沿襲類似的設計思路、根據實際開發內容進行改造後利用

形式語言與自動機 有限狀態機

其需求來自於對語言字串識別的需要,給定字串判定它是否屬於語法g產生的 l g 判斷是否屬於這個集合。句子識別 給定乙個字串,判定是否屬於給定語法g 的語言l g 一般來說,這是個難解的問題,並不是有乙個確定的過程,實際上它涉及到上節講的語法分析有關,給出句子的構造過程,與形式系統中公式的證明類似。對...

有限狀態機的實現

有限狀態機 finite state machine或者finite state automata 是軟體領域中一種重要的工具,很多東西的模型實際上就是有限狀態機。最近看了一些遊戲程式設計ai的材料,感覺遊戲中的ai,第一要說的就是有限狀態機來實現精靈的ai,然後才是a 尋路,其他學術界討論比較多的...

Unity有限狀態機實現

有限狀態機主要是用於狀態之間的切換,狀態之間的切換也可以通過switch case或者if else實現。由於使用二者實現主要是對用使用者擴充套件不是很方便,所以就有了有限狀態機的概念。有限狀態機主要是用於不同的狀態頻繁的切換。那在unity中我們如何定義有限狀態機?其實有限狀態機主要包括三部分,切...