简单使用有限自动机
2005-06-24 11:19
239 查看
最近写程序碰到一个问题,主要就是关于实时运行程序的状态转化,虽然可以将动作与状态写在一起解决,总是感觉不妥,于是上网找了一些资料学习了一下,写了一个有限自动机的类,将动作与状态分离,使用方便了许多。
类设计基本是照搬某篇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方法添加状态就完成了。用这个类管理有限状态机确实方便。如果做游戏的话,可能会对有限自动机使用比较多吧。
类设计基本是照搬某篇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方法添加状态就完成了。用这个类管理有限状态机确实方便。如果做游戏的话,可能会对有限自动机使用比较多吧。
相关文章推荐
- 有穷自动机的简单使用
- Kmp算法; 建立在有限自动机理解基础上; 思想相当简单了;
- 确定有限自动机(DFA)——一个简单的C++词法分析器
- 使用百度sdk简单定位
- PHP用户验证和标签推荐的简单使用
- 使用UItableview完成一个简单的QQ好友列表(二)
- Cookie的简单使用
- ActiveAndroid的简单使用
- 使用BlockingQueue实现包饺子( 生产者做面皮,消费者拿面皮包饺子)简单使用
- PHP5中PDO的简单使用 连接数据库
- nmon工具的安装及简单使用
- ios通知使用 书上案例 简单易懂
- Android最简单的基于FFmpeg的例子(四)---以命令行的形式来使用ffmpeg
- Executors多线程的简单使用
- SQL 使用函数一些简单的事例
- 节日短信中TabLayout+viewPager的简单使用
- iOS边练边学--UIPickerView和UIDatePicker的简单使用
- Spring中ClassPathXmlApplicationContext类的简单使用
- LinearLayout、RelativeLayout、FrameLayout简单使用
- gcc的简单使用