分層狀態機

2021-09-02 15:36:48 字數 1163 閱讀 5696

在網上看到了一篇對分層狀態機講解的簡單易懂的,現摘抄如下:

原版:如果我們讓npc巡邏兩個地方,比如安全的室內,和門口

如 果我們想在乙個狀態上附加一些狀況,例如當npc在巡邏時,讓他接乙個**然後再恢復巡邏,此時如果使用有限狀態機的話我們必須要新建乙個打**的狀態來 做過渡,但是此時的巡邏有兩個,所以能接到**的狀態也有兩個,然後加了兩個相同的狀態,很多這樣的重複的小狀態使得狀態機越來越複雜。如下圖

這時,我們可以用分層有限狀態機來解決這個問題,把多個狀態機歸為一層,如下圖,把巡邏安全處和門口歸為看守建築,這樣我們只需要有乙個打**狀態就可以了。

分層有限狀態機增加了乙個滯後,在有限狀態機中並沒有,在乙個普通的有限狀態機中,是從初始狀態開始的,在分層有限狀態機中是乙個巢狀的狀態。注意上圖有h 的圈,代表歷史狀態(history state),當我們第一次進入巢狀狀態->看守建築時,歷史狀態h表示為初始狀態,之後歷史狀態h表示為最近處在的乙個狀態。

在我們的例 子中:初始狀態就是看守建築,,然後進入看到手機按住這個巢狀,巡邏安全處是初始狀態。當從巡邏安全處轉換到巡邏門口這個狀態時,h歷史狀態就轉變為巡邏 門口狀態,此時來**了,轉換到接**狀態,接**結束,我們回到巢狀狀態中的歷史狀態,此時為巡邏門口,可見h歷史狀態就是乙個臨時的,便於巢狀外的狀態返回到之前的巢狀內的小狀態,以不至於出錯,或者換回了別的狀態,如果接完**回到巡邏安全處,那就出大錯了。

分層有限狀態機,就這樣避免了重複狀態,可以實現更大的更複雜的狀態。

以上原版:

下面說下自己看了其他一些資料後對分層狀態機的理解。

對於層次狀態機有父狀態與子狀態的區別,上述巡邏接**的例子中,巡邏(watch building)是父狀態,子狀態是在安全室內與在門口兩個狀態。這裡有個histroy狀態,是因為父狀態需要將資訊傳給子狀態。

狀態機 狀態機0

近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...

python 狀態機 Python 狀態機

class statemachine def init self self.handlers 狀態轉移函式字典 self.startstate none 初始狀態 self.endstate 最終狀態集合 引數name為狀態名,handler為狀態轉移函式,end state表明是否為最終狀態 de...

狀態機小記

工作上有個功能模組用到了類似狀態機的東東,於是上網科普了一番。狀態機是由一系列輸入驅動,然後系統由其中一種狀態轉換為另一種狀態並產生某種輸出,這樣子的乙個系統叫做狀態機。狀態機分為兩種,一種是輸出只和系統狀態有關,叫做摩爾狀態機,另一種是輸出和輸入以及系統狀態都相關,叫做公尺莉狀態機。有關輸入 狀態...