C 狀態機實現V1 0

2021-06-06 02:57:25 字數 4106 閱讀 8210

實現狀態機框架,可以繼承此框架的基類實現自定義功能,需要quickhash標頭檔案,原始碼如下,請尊重原創!歡迎批評指正!

fsm.h

#ifndef fsm_h

#define fsm_h

#include #include "quickhash.h"

#include "fsmstate.h"

#include "typetag.h"

/**@file fsm.h

* 實現狀態機

* @author xiaoxing.zhou

* @date 2012.4.27

* @version v1.0

*/class eventbase;

class fsm

/**啟動狀態機*/

bool startrun();

/**停止狀態機*/

bool stoprun();

/**處理event*/

void process(eventbase* pevent);

/**預設執行方法*/

virtual bool default();

void transitstate(typetag* ptag);

/**事件與狀態註冊方法*/

static void registerevent(const char* pname, int id);

static void registerstate(const char* pname, int id);

static typetag* retrivestate(const char* pname);

static typetag* retriveevent(const char* pname);

protected:

/**查詢狀態*/

fsmstate* findstate(typetag* ptag);

private:

//!儲存state和event標識

typedef quickhashhashtable;

static hashtable m_statetag;

static hashtable m_eventtag;

typedef typetag eventtag;

typedef typetag statetag;

fsmstate* m_pstate;

fsmstate* m_pexitstate;

std::vectorm_statevect;

};#endif

fsm.cpp

#include "fsm.h"

#include "eventbase.h"

fsm::hashtable fsm::m_statetag;

fsm::hashtable fsm::m_eventtag;

fsm::fsm()

fsm::~fsm()

bool fsm::setexit(const char* pname)

bool fsm::addstate(fsmstate* pstate)

bool fsm::startrun()

return false;

}bool fsm::stoprun()

return false;

}void fsm::process(eventbase* pevent)

else

}else

} else }}

bool fsm::default()

void fsm::transitstate(typetag* ptag) }}

void fsm::registerevent(const char* pname, int id)

void fsm::registerstate(const char* pname, int id)

typetag* fsm::retrivestate(const char* pname)

typetag* fsm::retriveevent(const char* pname)

fsmstate* fsm::findstate(typetag* ptag)

} return null;

}

fsmstate.h

#ifndef fsm_state_h

#define fsm_state_h

#include #include "typetag.h"

/**@file fsmstate.h

* 定義狀態機狀態基類.

* @author xiaoxing.zhou

* @date 2012.4.27

* @version v1.0

*//**@class eventbase

* 宣告事件基類.

*/class eventbase;

class fsmstate;

/**狀態進入執行方法*/

virtual void enter();

/**狀態離開執行方法*/

virtual void exit();

/**未定義事件發生執行方法*/

virtual bool default();

/**新增狀態允許發生事件列表*/

void addevent(const char* pname);

/**匹配函式*/

bool match(typetag* ptag)

/**判斷是否允許事件*/

bool findevent(typetag* ptag);

private:

typetag* m_ptag;

std::vectorm_eventvect;//!< 事件列表

};#endif

fsmstate.cpp

#include "fsmstate.h"

#include "fsm.h"

#include "eventbase.h"

fsmstate::fsmstate(const char* pname)

void fsmstate::addevent(const char* pname)

bool fsmstate::findevent(typetag* ptag)

virtual ~eventbase(){};

/**事件發生時候執行的操作*/

/**匹配函式*/

bool match(typetag* ptag)

/**獲取事件標識*/

typetag* gettag()

/**獲取轉移狀態標識*/

typetag* getnextstate()

private:

typetag* m_peventtag;

typetag* m_pstatetag;

};#endif

typetag.h

#ifndef type_tag_h

#define type_tag_h

#include /**@file typetag.h

* 定義標識類,用於標識event和state.

* @author xiaoxing.zhou

* @date 2012.4.27

* @version v1.0

*/class typetag

/**獲取id*/

int getid()

/**獲取名稱*/

const char* getname()

/**匹配函式*/

bool match(int id)

bool match(const char* pname)

private:

int m_id;

std::string m_name;

};#endif

簡單測試**main.cpp

#include "fsm.h"

#include "eventbase.h"

int main(void)

kanzi狀態機實現

1.在library中選中state managers建立create state manager。2.在library中選中property types建立create property type,name state category custom datatype interger。3.修改s...

C語言實現狀態機

狀態機有4個要素 舉例 state1是現態,state2是次態,event是條件,action是動作。當產生event時,觸發action,action執行完畢後從state1遷移到state2,此時,state2為現態。在這個例子中,action只是乙個瞬時執行的動作,它只在現態遷移到次態的過程中...

C 遊戲 極品蜜蜂V1 0

閒著無聊,開發第二個遊戲,懷戀小時候在遊戲機上玩的那種什麼飛機。遊戲介面 本來是想做成飛機的,無奈沒有找到飛機,於是用乙隻蜜蜂代替。本遊戲屬於碰撞類遊戲,主要用到了aabb類。遊戲中的物體都是該類派生的子類。aabb類描述如下 using system using system.collection...