• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            游戲中的有限狀態(tài)機(jī)

            這是GAMEGEMS中的第三章的第一部分,番的不好。你可以直接閱讀原文。原本以為這是人工智能的部分,看到一半才發(fā)現(xiàn)只是一個(gè)簡(jiǎn)單的框架。如果你想學(xué)人工智能,這里沒有,就不要浪費(fèi)時(shí)間了。由于本人水平有限,其中難免會(huì)出現(xiàn)原則性的錯(cuò)誤,希望指正。

            關(guān)鍵字:有限狀態(tài)機(jī)、狀態(tài)、輸入、狀態(tài)轉(zhuǎn)換、輸出狀態(tài)當(dāng)前狀態(tài)

            一個(gè)有限狀態(tài)機(jī)類
            在這篇文章中,我們創(chuàng)建了一個(gè)通用的有限狀態(tài)機(jī)(FSM)的C++類。有限狀態(tài)機(jī)是計(jì)算機(jī)科學(xué)和數(shù)學(xué)理論的抽象,它在許多的方面是很有用處的。這里我們不去講解有限狀態(tài)機(jī)的理論上的知識(shí)。而是講如何實(shí)現(xiàn)一個(gè)有限狀態(tài)機(jī),有限狀態(tài)機(jī)在游戲的人工智能方面是很有用處的。

            有限狀態(tài)機(jī)是由有限的狀態(tài)組成的一個(gè)機(jī)制。一個(gè)狀態(tài)就是一個(gè)狀況。你考慮一下門;它的狀態(tài)關(guān)以及未鎖。

            對(duì)于一個(gè)有限狀態(tài)機(jī),它應(yīng)該有一個(gè)輸入。這個(gè)輸入可以影響狀態(tài)轉(zhuǎn)換。有限狀態(tài)機(jī)應(yīng)該有一個(gè)簡(jiǎn)單(或復(fù)雜)的狀態(tài)轉(zhuǎn)換函數(shù),這個(gè)函數(shù)可以決定什么狀態(tài)可以變成當(dāng)前狀態(tài)。

            這個(gè)當(dāng)前的新狀態(tài)被稱為有限狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換輸出狀態(tài)。如果你對(duì)這個(gè)概念有些迷惑,就把做為理解有限狀態(tài)機(jī)的例子。當(dāng)一個(gè)處于關(guān)閉狀態(tài)和狀態(tài),當(dāng)你輸入了使用鑰匙時(shí),門的狀態(tài)可以變成未鎖狀態(tài)(即狀態(tài)轉(zhuǎn)換的輸出狀態(tài),也就是門的當(dāng)前狀態(tài))。當(dāng)你輸入了使用手時(shí),門的狀態(tài)可以轉(zhuǎn)換成的狀態(tài)。當(dāng)門處于的狀態(tài)時(shí),我們輸入使用手時(shí),會(huì)使門的狀態(tài)重新回到關(guān)的狀態(tài)。當(dāng)處于關(guān)的狀態(tài)時(shí),我們輸入使用鑰匙時(shí),這將會(huì)使門重新回到的狀態(tài)。當(dāng)門處于的狀態(tài),我們輸入使用手,就不能把門的狀態(tài)轉(zhuǎn)換到的狀態(tài),門仍然會(huì)保持的狀態(tài)。還有,當(dāng)門處于的狀態(tài)時(shí),我們輸入使用鑰匙是不能把門的狀態(tài)轉(zhuǎn)換成的狀態(tài)的。

            總之,有限狀態(tài)機(jī)是一個(gè)有限的狀態(tài)組成的,其中的一個(gè)狀態(tài)是當(dāng)前狀態(tài)。有限狀態(tài)機(jī)可以接受一個(gè)輸入,這個(gè)輸入的結(jié)果將導(dǎo)致一個(gè)狀態(tài)轉(zhuǎn)換的發(fā)生(即從當(dāng)前狀態(tài)轉(zhuǎn)換到輸出狀態(tài))。這個(gè)狀態(tài)轉(zhuǎn)換是基于狀態(tài)轉(zhuǎn)換函數(shù)的。狀態(tài)轉(zhuǎn)換完成之后,輸出狀態(tài)即變成了當(dāng)前狀態(tài)

            輸入 狀態(tài)轉(zhuǎn)換函數(shù)
            當(dāng)前狀態(tài)-----》狀態(tài)轉(zhuǎn)換-------------》輸出狀態(tài)(當(dāng)前狀態(tài))

            那么,人們是如何將這個(gè)概念應(yīng)用到游戲的AI系統(tǒng)中的呢?有限狀態(tài)機(jī)的功能很多:管理游戲世界、模擬NPC的思維、維護(hù)游戲狀態(tài)、分析玩游戲的人的輸入,或者管理一個(gè)對(duì)象的狀態(tài)。

            假如在一個(gè)冒險(xiǎn)游戲中有一個(gè)NPC,名字可以叫MONSTER。我們可以先假設(shè)這個(gè)MONSTER在游戲中有如下的狀態(tài):BERSERKRAGE、MAD、ANNOYED以及UNCARING。(前幾個(gè)狀態(tài)不好分別)。假設(shè),MONSTER對(duì)于不同的狀態(tài)可以執(zhí)行不同的操作,并且假設(shè)你已經(jīng)有了這些不同操作的代碼。我們這時(shí)可以使用有限狀態(tài)機(jī)來模擬這個(gè)MONSTER的行為了。只要我們給出不同的輸入,MONSTER就會(huì)做出不同的反應(yīng)。我們?cè)賮碇赋鲞@些輸入是什么:PLAYER SEEN、PLAYER ATTACKSPLAYERGONE、MONSTER HURT、MONSTER HEALED。這樣我們可以得到一個(gè)狀態(tài)轉(zhuǎn)換的表格,如下:游戲狀態(tài)轉(zhuǎn)換表:

            當(dāng)前狀態(tài) 輸入 輸出狀態(tài)
            UNCARING PLAYER SEEN ANNOYED
            UNCARING PLAYER ATTACKS MAD
            MAD MONSTER HURT RAGE
            MAD MONSTER HEALED UNCARING
            RAGE MONSTER HURT BERSERK
            RAGE MONSTER HEALED ANNOYED
            BERSERK MONSTER HURT BERSERK
            BERSERK MONSTER HEALED RAGE
            ANNOYED PLAYER GONE UNCARING
            ANNOYED PLAYER ATTACKS RAGE
            ANNOYED MONSTER HEALED UNCARING

            根據(jù)上面的這個(gè)表格,我們可以很容易的畫出一個(gè)MONSTER狀態(tài)轉(zhuǎn)換圖MONSTER的每一個(gè)狀態(tài)就是圖中的頂點(diǎn)。
            因此,根據(jù)當(dāng)前狀態(tài)和對(duì)FSM的輸入,MONSTER的狀態(tài)將被改變。這時(shí)根據(jù)MONSTER的狀態(tài)執(zhí)行相應(yīng)操作的代碼(假設(shè)已經(jīng)實(shí)現(xiàn))將被執(zhí)行,這時(shí)MONSTER好像是具備了人工智能。顯然,我們可以定義更多的狀態(tài),寫出更多的輸入,寫出更多的狀態(tài)轉(zhuǎn)換,這樣,MONSTER可以表現(xiàn)的更真實(shí),生動(dòng),當(dāng)然,這些游戲的規(guī)則問題應(yīng)該是策劃制定的。

            FSMclass
            以及FSMstate

            現(xiàn)在,我們?nèi)绾伟堰@些方法變成現(xiàn)實(shí)?使用FSMclass和它的組成部分FSMstate可以實(shí)現(xiàn)這些想法。

            定義FSMstate
            class FSMstate
            {
                unsigned m_usNumberOfTransition; //
            狀態(tài)的最大數(shù)
                int* m_piInputs; //
            為了轉(zhuǎn)換而使用的輸入數(shù)組
                int* m_piOutputState; //
            輸出狀態(tài)數(shù)組
                int m_iStateID; //
            這個(gè)狀態(tài)的唯一標(biāo)識(shí)符
            public:
                //
            一個(gè)構(gòu)造函數(shù),可以接受這個(gè)狀態(tài)的ID和它支持的轉(zhuǎn)換數(shù)目
                FSMstate(int iStateID,unsigned usTransitions);
                //
            析構(gòu)函數(shù),清除分配的數(shù)組
                ~FSMstate();
                //
            取這個(gè)狀態(tài)的ID
                int GetID(){return m_iStateID;}
                //
            向數(shù)組中增加狀態(tài)轉(zhuǎn)換
                void AddTransition(int iInput,int iOutputID);
                //
            從數(shù)組中刪除一個(gè)狀態(tài)轉(zhuǎn)換
                void DeleteTransition(int iOutputID);
                //
            進(jìn)行狀態(tài)轉(zhuǎn)換并得到輸出狀態(tài)
                int GetOutput(int iInput);
            };


            對(duì)這個(gè)類的分析:
            功能:主要是實(shí)現(xiàn)與一個(gè)狀態(tài)相關(guān)的各種操作。我們前面假設(shè)了MONSTER的各種狀態(tài):
            #define STATE_ID_UNCARING 1
            #define STATE_ID_MAD 2
            #define STATE_ID_RAGE 3
            #define STATE_ID_BERSERK 4
            #define STATE_ID_ANNOYED 5

            狀態(tài)轉(zhuǎn)換所需的輸入有:
            #define INPUT_ID_PLAYER_SEEN 1
            #define INPUT_ID_PLAYER_ATTACK 2
            #define INPUT_ID_PLAYER_GONE 3
            #define INPUT_ID_MONSTER_HURT 4
            #define INPUT_ID_MONSTER_HEALED 5


            以上是五個(gè)狀態(tài)的標(biāo)識(shí)符。
            我們就要聲明5個(gè)FSMstate的實(shí)例,每一個(gè)實(shí)例代表一個(gè)狀態(tài)和與之有關(guān)的操作。假設(shè)我們先處理狀態(tài)STATE_ID_MAD
            類成員變量m_iStateID就等于STATE_ID_MAD類成員變量m_usNumberOfTransition就是可由這個(gè)狀態(tài)轉(zhuǎn)換成的狀態(tài)的個(gè)數(shù),前面有一個(gè)表,其中有兩個(gè)狀態(tài)可以由這個(gè)狀態(tài)產(chǎn)生,它們分別是STATE_ID_UNCARINGSTATE_ID_RAGE
            這時(shí),m_usNumberOfTransition等于2。

            m_piInputs
            是一個(gè)指針變量,它保存與這個(gè)狀態(tài)相關(guān)的輸入,在前面的表中我們知道與STATE_ID_MAD相關(guān)的輸入為
            INPUT_ID_MONSTER_HURT
            INPUT_ID_MONSTER_HEALED,因此m_piInputs中存放的是這兩個(gè)數(shù)據(jù)。
            m_piOutputState存放的是與STATE_ID_MAD相關(guān)的狀態(tài),即STATE_ID_RAGESTATE_ID_UNCARING,這樣,m_piOutputState中存放的數(shù)據(jù)便是這兩個(gè)值。

            以上是對(duì)成員變量的解釋,下面解釋成員函數(shù):
            構(gòu)造函數(shù)
            FSMstate::FSMstate(int iStateID,unsigned usTransitions)
            {
                if(!usTransitions) //
            如果給出的轉(zhuǎn)換數(shù)量為0,就算為1
                    m_usNumberOfTransitions=1;
                else
                    m_usNumberOfTransitions=usTransitions;

                //
            將狀態(tài)的ID保存起來
                m_iStateID=iStateID;

                //
            分配內(nèi)存空間
                try
                {
                    m_piInputs=new int[m_usNumberOfTransitions];
                    for(int i=0;i<m_usNumberOfTransitions;++i)
                        m_piInputs[i]=0;
                }
                catch(...)
                {
                    throw;
                }
                try
                {
                    m_piOutputState=new int[m_usNumberOfTransition];
                    for(int i=0;i<m_usNumberOfTransitions;++i)
                        m_piOutputState[i]=0;
                }
                catch(...)
                {
                    delete [] m_piInputs;
                    throw;
                }
            }


            這就是構(gòu)造函數(shù),在FSMstate類中共有四個(gè)成員變量,在這個(gè)函數(shù)中全部被初始化了。FSMstate是一個(gè)類,是否還記得MONSTER的狀態(tài)(如MAD、UNCARING)。這個(gè)類就是實(shí)現(xiàn)對(duì)MONSTER的一個(gè)狀態(tài)的管理的。假如這個(gè)狀態(tài)是STATE_ID_MAD,與這個(gè)狀態(tài)相關(guān)的狀態(tài)有兩個(gè),上面已經(jīng)講過了。這時(shí)我們給成員變量賦值,在這個(gè)具體例子中它們的值如下:

            m_usNumberOfTransition=2
            m_piInput[0]=0;
            m_piInput[1]=0;
            m_piOutputState[0]=0;
            m_piOutputState[1]=0;
            m_iStateID=STATE_ID_MAD;

            析構(gòu)函數(shù):
            FSMState::~FSMState()
            {
                delete [] m_piInputs;
                delete [] m_piOutputState;
            }

            析構(gòu)函數(shù)將動(dòng)態(tài)分配的存儲(chǔ)空間釋放了。

            void FSMstate::AddTransition(int iInput,int iOutputID)
            {
                for(int i=0;i<m_usNumberOfTransitions;++i)
                    if(!m_piOutputState[i]) break;
                        if(i<m_usNumberOfTransition)
                        {
                            m_piOutputState[i]=iOutputID;
                            m_piInputs[i]=iInput;
                        }
            }


            這個(gè)函數(shù)給兩個(gè)前面構(gòu)造函數(shù)動(dòng)態(tài)分配的空間加入數(shù)據(jù),首先要找到兩個(gè)數(shù)組中找到適當(dāng)?shù)奈恢茫?,如果位置是合法?span lang="EN-US">
            我們就可以把數(shù)據(jù)加入這兩個(gè)數(shù)組中。因?yàn)?span lang="EN-US">STATE_ID_MAD與兩個(gè)狀態(tài)有關(guān),因此,我們可以調(diào)用兩次這個(gè)函數(shù),把這兩個(gè)狀態(tài)加入到類中:

            AddTransition(INPUT_ID_MONSTER_HURT,STATE_ID_RAGE);
            AddTransition(INPUT_ID_MONSTER_HEALED,STATE_ID_UNCARING)

            這樣,與狀態(tài)STATE_ID_MAD相關(guān)的狀態(tài)輸入也加入了。

            void FSMstate::DeleteTransition(int iOutputID)
            {
                //
            遍歷每一個(gè)輸出狀態(tài)
                for(int i=0;i<m_usNumberOfTransitions;++i)
                {
                    //
            如果找到輸出狀態(tài),退出循環(huán)
                    if(m_piOutputState[i]==iOutputID)
                        break;
                }
                //
            如果沒有找到輸出狀態(tài),返回
                if(i>=m_usNumberOfTransitions)
                    return;
                //
            將輸出狀態(tài)的內(nèi)容置0
                m_piInputs[i]=0;
                m_piOutputState[i]=0;

                //
            被刪除的輸出狀態(tài)的后面的輸出狀態(tài)前移
                for(;i<(m_usNumberOfTransition-1);++i)
                {
                    if(!m_piOUtputState[i])
                        break;
                    m_piInputs[i]=m_piInputs[i+1];
                    m_piOutputState[i]=m_piOutputState[i+1];
                }
                //
            最后面的輸出狀態(tài)置0
                m_piInputs[i]=0;
                m_piOutputState[i]=0;
            }


            這個(gè)函數(shù)是要?jiǎng)h除與一個(gè)狀態(tài)相關(guān)的輸出狀態(tài)。設(shè)一個(gè)狀態(tài)STATE_ID_MAD,與之相關(guān)的狀態(tài)有兩個(gè)STATE_ID_RAGE,STATE_ID_UNCARING,當(dāng)然這是經(jīng)過初始化以及前面的添加狀態(tài)函數(shù)之后,產(chǎn)生了這兩個(gè)相關(guān)的狀態(tài)。你想刪除哪一個(gè)?如果你想刪除相關(guān)的輸出狀態(tài),只要在刪除函數(shù)中指出那個(gè)狀態(tài)即可,例如:

            DeleteTransition(STATE_ID_RAGE);
            你就可以刪除輸出狀態(tài)STATE_ID_RAGE了。

            int FSMstate::GetOutput(int iInput)
            {
                //
            先給輸出狀態(tài)賦值(如果未找到與輸入對(duì)應(yīng)的輸出狀態(tài)時(shí),返回這個(gè)值)
                int iOutputID=m_iStateID;

                //
            遍歷輸出狀態(tài)
                for(int i=0;i<m_usNumberOfTransitions;++i)
                {
                    //
            如果沒找到,退出循環(huán)
                    if(!m_piOutputState[i])
                        break;
                    //
            如果找到了與輸入相對(duì)應(yīng)的輸出狀態(tài),進(jìn)行賦值。
                    if(iInput==m_piInputs[i])
                    {
                        iOutputID=m_piOutputState[i];
                        break;
                    }
                }
                //
            返回輸出狀態(tài)
                return(iOutputID);
            }


            這個(gè)函數(shù)功能是返回與輸入相對(duì)應(yīng)的輸出狀態(tài)的標(biāo)識(shí)。如果沒有與輸入相對(duì)應(yīng)的輸出狀態(tài),返回原來的狀態(tài),如果有與之對(duì)應(yīng)的輸出狀態(tài),返回這個(gè)狀態(tài)的ID。

            下面定義的是FSMclass,這個(gè)類用于維護(hù)FSMstate對(duì)象集合。
            class FSMclass
            {
                State_Map m_map; //
            包括了狀態(tài)機(jī)的所有狀態(tài)
                int m_iCurrentState; //
            當(dāng)前狀態(tài)的ID
            public:
                FSMclass(int iStateID); //
            初始化狀態(tài)
                ~FSMclass()
                //
            返回當(dāng)前狀態(tài)ID
                int GetCurrentState() {return m_iCurrentState;}
                //
            設(shè)置當(dāng)前狀態(tài)ID
                void SetCurrentState(int iStateID) {m_iCurrentState=iStateID;}
                //
            返回FSMstate對(duì)象指針
                FSMstate* GetState(int iStateID);
                //
            增加狀態(tài)對(duì)象指針
                void AddState(FSMstate* pState);
                //
            刪除狀態(tài)對(duì)象指針
                void DeleteState(int iStateID);
                //
            根據(jù)當(dāng)前狀態(tài)輸入完成狀態(tài)的轉(zhuǎn)換。
                int StateTransition(int iInput);
            };


            FSMclass::m_map
            FSMstate對(duì)象的集合,是從STL<map>中實(shí)現(xiàn)的。
            FSMclass::m_iCurrentState
            FSMstate對(duì)象的狀態(tài)標(biāo)識(shí),是有限狀態(tài)機(jī)的當(dāng)前狀態(tài)。

            FSMclass::GetCurrentState()
            可以用之訪問當(dāng)前的FSMstate對(duì)象的狀態(tài)的標(biāo)識(shí)符。
            FSMclass::SetCurrentState()
            可以設(shè)置當(dāng)前FSMstate對(duì)象的狀態(tài)的標(biāo)識(shí)符。
            FSMclass::GetState()
            可以取得有限狀態(tài)機(jī)中的任何FSMstate對(duì)象的指針。
            FSMclass::AddState()
            增加有限狀態(tài)機(jī)中的FSMstate對(duì)象。
            FSMclass::DeleteState()
            刪除有限狀態(tài)機(jī)中的FSMstate對(duì)象
            FSMclass::StateTransition()
            初始化狀態(tài)轉(zhuǎn)換,根據(jù)輸入返回輸出狀態(tài)。

            這個(gè)類使用了STL,我不知道它怎么用:)。聽說是高人才使用它,高人起碼要寫過上萬行的代碼。因此不能詳細(xì)介紹這個(gè)類了

            總之,可以這么理解這兩個(gè)類FSMstate,FSMclass.FSMstate代表了一個(gè)狀態(tài)以及和狀態(tài)相關(guān)的數(shù)據(jù)和操作。如在MONSTER中有五個(gè)狀態(tài),我們就要聲明五個(gè)類的對(duì)象,每個(gè)對(duì)象中包括了與這個(gè)狀態(tài)相關(guān)的狀態(tài),輸入和各種轉(zhuǎn)換函數(shù)??梢哉fFSMstate是對(duì)每一個(gè)狀態(tài)的封裝(包括相關(guān)數(shù)據(jù)和操作),游戲中的對(duì)象有多少狀態(tài),就要聲明多少個(gè)FSMstate對(duì)象。而FSMclass則是對(duì)這若干個(gè)FSMstate對(duì)象(這個(gè)例子中MONSTER有五個(gè)狀態(tài))進(jìn)行的封裝。在FSMclass中指明了若干個(gè)FSMstate中哪一個(gè)是當(dāng)前的MONSTER擁有的狀態(tài)并且可以設(shè)置,得到以及刪除狀態(tài),并且可以進(jìn)行狀態(tài)間的轉(zhuǎn)換。

            總之:游戲中的MONSTER有多少狀態(tài),游戲中就要聲明多少的FSMstate對(duì)象,每一個(gè)FSMstate對(duì)象包括了與特定的狀態(tài)相關(guān)的數(shù)據(jù)和操作。而FSMclass只有一個(gè),它用于協(xié)調(diào)若干個(gè)FSMstate之間的關(guān)系和操作。

            下面是如何在游戲中使用兩個(gè)類的例子:

            首先是創(chuàng)建FSMstate對(duì)象(若干個(gè)),有多少狀態(tài)就要循環(huán)多少次,下面是增加STATE_ID_UNCARING狀態(tài)的例子:
            FSMstate* pFSMstate=NULL;
            //創(chuàng)建狀態(tài)
            try
            {
                //
            第一個(gè)參數(shù)是增加狀態(tài)的標(biāo)識(shí),第二個(gè)參數(shù)指明了與這個(gè)
                //
            狀態(tài)相關(guān)的狀態(tài)的個(gè)數(shù)。
                pFSMstate=new FSMstate(STATE_ID_UNCARING,2);
            }
            catch(...)
            {
                throw;
            }


            //之后給這個(gè)狀態(tài)加入相關(guān)的輸入輸出狀態(tài)
            pFSMstate->AddTransition(INPUT_ID_PLAYER_SEEN,STATE_ID_ANNOYED);
            pFSMstate->AddTransition(INPUT_ID_PLAYER_ATTACKS,STATE_ID_MAD);


            這個(gè)函數(shù)指明了與特定狀態(tài)相關(guān)的輸入輸出狀態(tài)
            比如第一個(gè)函數(shù),它表明如果我要輸入一個(gè)INPUT_ID_PLAYER_SEEN,這時(shí)就會(huì)產(chǎn)生一個(gè)輸出狀態(tài),STATE_ID_ANNOYED
            我們應(yīng)該為每一個(gè)狀態(tài)做上面的事情,這里就略過了。之后我們要聲明一個(gè)FSMclass對(duì)象,用于協(xié)調(diào)上面的FSMstate對(duì)象之間的關(guān)系。

            try
            {
                m_pFSMclass=new FSMclass(STATE_ID_UNCARING);
            }
            catch(...)
            {
                throw;
            }


            上面指明了MONSTER的當(dāng)前狀態(tài)是STATE_ID_UNCARING最后將FSMstate對(duì)象分別加入到FSMclass中。

            下面介紹如何使用FSMclass
            使用十分簡(jiǎn)單,只要我們給出一個(gè)輸入,之后,我們便可以得到一個(gè)輸出狀態(tài),根據(jù)這個(gè)輸出狀態(tài)我們執(zhí)行相應(yīng)的操作,最后,把這個(gè)輸出狀態(tài)變成MONSTER的當(dāng)前狀態(tài)。

            在游戲中發(fā)生了一些事情,如玩游戲的人指出他控制的人進(jìn)攻MONSTER(用鼠標(biāo)點(diǎn)擊了MONSTER),這時(shí)會(huì)產(chǎn)生一個(gè)輸入”iInputID=INPUT_ID_PLAYER_ATTACK;

            這時(shí),我們調(diào)用狀態(tài)轉(zhuǎn)換函數(shù):
            m_iOutputState=m_pFSMclass->StateTransition(iInputID);

            這時(shí),我們的輸入對(duì)MONSTER產(chǎn)生了刺激,產(chǎn)生了一個(gè)輸出狀態(tài)。這時(shí)我們根據(jù)這個(gè)輸出狀態(tài)調(diào)用相應(yīng)的代碼執(zhí)行就可以了,這時(shí)的MONSTER好像有應(yīng)反了,我們說它有了簡(jiǎn)單的智能。

            if(m_iOutputState==STATE_ID_MAD)
            {
                //some code for the monster to act mad
            }


            當(dāng)然,我們也應(yīng)該把其它狀態(tài)執(zhí)行的操作也寫出來,但只寫一個(gè)就可以了。使用這個(gè)狀態(tài)機(jī)就是這么簡(jiǎn)單??傊?,FSMclass不是全部的人工智能,相反,它只是一個(gè)框架,一個(gè)開始智能需要的還很多。只要你可以分出狀態(tài),并且知道什么輸入產(chǎn)生什么輸出狀態(tài)就可以了,當(dāng)然這是一個(gè)游戲的規(guī)則,策劃應(yīng)當(dāng)完成這個(gè)部分?

             

            posted on 2008-12-14 17:56 肥仔 閱讀(2459) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 狀態(tài)機(jī) & 自動(dòng)機(jī) & 形式語言

            久久久久青草线蕉综合超碰| 久久婷婷国产综合精品| 精品国产91久久久久久久a| 国产精品欧美久久久久天天影视| 久久久精品人妻无码专区不卡| 中文国产成人精品久久亚洲精品AⅤ无码精品 | www亚洲欲色成人久久精品| 久久人人爽人人爽AV片| 久久综合综合久久综合| 99久久精品免费观看国产| 无码任你躁久久久久久老妇App| 久久久久无码精品国产| 久久亚洲2019中文字幕| 久久综合给合久久狠狠狠97色69| 青青青国产精品国产精品久久久久| 久久精品中文字幕第23页| 久久精品亚洲AV久久久无码| 66精品综合久久久久久久| 热99RE久久精品这里都是精品免费| 72种姿势欧美久久久久大黄蕉| 久久成人18免费网站| 人妻无码αv中文字幕久久琪琪布| 国产精品欧美久久久久天天影视| 伊人久久大香线蕉综合影院首页| 88久久精品无码一区二区毛片 | 一级a性色生活片久久无少妇一级婬片免费放 | 久久久亚洲裙底偷窥综合| 久久99精品国产| 亚洲综合熟女久久久30p| 久久97久久97精品免视看秋霞| 色诱久久久久综合网ywww| 久久久中文字幕日本| 久久久中文字幕| 人妻无码αv中文字幕久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久综合九色欧美综合狠狠| 72种姿势欧美久久久久大黄蕉| 欧美亚洲国产精品久久高清| 久久久久久A亚洲欧洲AV冫| 久久久久综合网久久| 成人久久精品一区二区三区|