最近写程序碰到一个问题,主要就是关于实时运行程序的状态转化,虽然可以将动作与状态写在一起解决,总是感觉不妥,于是上网找了一些资料学习了一下,写了一个有限自动机的类,将动作与状态分离,使用方便了许多。
类设计基本是照搬某篇E文资料中的。
class FSMstate
{
public:
int GetID(); //得到本StateID
void AddTransition(int iInput, int iOutputID); //增加转化
void DeleteTransition(int iOutputID); //删除转化
int GetOutput(int iInput); //得到某个转化
void InitState(int iStateID, unsigned usTransitions); //初始化
void Release(); //释放空间
FSMstate(int iStateID, unsigned usTransitions);
FSMstate();
virtual ~FSMstate();
private:
unsigned m_usNumberOfTransitions;//状态最大数
int *m_piInputs; //输入数组
int *m_piOutputState; //输出状态数组
int m_iStateID; //本状态标识符
};
class FSMclass
{
public:
FSMstate * CreateFSMstate(int iStateID, unsigned usTransitions); //创建用于Add
int GetCurrentState() { return m_iCurrentState; } //返回当前状态ID
void SetCurrentState(int iStateID) { m_iCurrentState = iStateID; } //设置当前状态ID
FSMstate* GetState(int iStateID); //返回FSMstate对象指针
void AddState(FSMstate* pState); //增加状态对象指针
void DeleteState(int iStateID); //删除状态对象指针
int StateTransition(int iInput); //转换状态。
void Release();
FSMclass(int iStateID); //初始化状态
FSMclass();
virtual ~FSMclass();
private:
vector<FSMstate *> m_states; //包括了状态机的所有状态
int m_iCurrentState; //当前状态的ID
};
使用时实例化一个FSMclass,然后创建FSMstate,用AddTransition()方法把有限自动机的输入输出添加进去,然后用FSMclass类的AddState方法添加状态就完成了。用这个类管理有限状态机确实方便。如果做游戏的话,可能会对有限自动机使用比较多吧。