- 40
- 0
/*================================================================
- Copyright (C) 2017 Ltd. All rights reserved.
- FileName:fsm.cpp
- Author: shrekshen
- Create-time:2017-12-19 20:18:03
- Describle:study fsm, reference:http://blog.csdn.net/popy007/...
*
================================================================*/
include <iostream>
include <map>
using namespace std;
class Fsm;//前置声明
//首先创建一个gamestate类,它是其他状态类的基类
enum E_GAME_STATE
{
E_INTO_GAME = 0,
E_PLAY_GAME = 1,
E_LEFT_GAME = 2
};
class GameState
{
public:
virtual ~GameState(){}
virtual void drive() = 0;
GameState(Fsm* fsm)
{
m_fsm = fsm;
}
Fsm *m_fsm;
};
//然后添加一个管理这些类的管理类,也就是状态机
class Fsm
{
public:
void add_state(E_GAME_STATE gameState , GameState *state)
{
state_map.insert(pair<E_GAME_STATE, GameState *>(gameState, state));
}
void switch_state(E_GAME_STATE gameState)
{
std::map<E_GAME_STATE, GameState *>::iterator it = state_map.find(gameState);
current_state = it->second;
current_state->drive();
}
protected:
std::map<E_GAME_STATE, GameState *> state_map;
GameState *current_state;
};
class IntoGameState : public GameState
{
public:
IntoGameState(Fsm *fsm):GameState(fsm)
{
}
public:
virtual void drive()
{
cout << "IntoGameState" << endl;
m_fsm->switch_state(E_PLAY_GAME);
}
};
class PlayGameState : public GameState
{
public:
PlayGameState(Fsm *fsm):GameState(fsm)
{
}
public:
virtual void drive()
{
cout << "PlayGameState" << endl;
m_fsm->switch_state(E_LEFT_GAME);
}
};
class LeftGameState : public GameState
{
public:
LeftGameState(Fsm *fsm):GameState(fsm)
{
}
public:
virtual void drive()
{
cout << "LeftGameState" << endl;
m_fsm->switch_state(E_INTO_GAME);
}
};
int main(){
Fsm *fsm = new Fsm;
GameState *intostate = new IntoGameState(fsm);
GameState *playstate = new PlayGameState(fsm);
GameState *leftstate = new LeftGameState(fsm);
fsm->add_state(E_INTO_GAME, intostate);
fsm->add_state(E_PLAY_GAME, playstate);
fsm->add_state(E_LEFT_GAME, leftstate);
fsm->switch_state(E_LEFT_GAME);
}
最近在学习设计模式,写的一个简单的状态机,遇到了这个问题,麻烦各位看看。
class Fsm;//前置声明
//首先创建一个gamestate类,它是其他状态类的基类
enum E_GAME_STATE
{
E_INTO_GAME = 0,
E_PLAY_GAME = 1,
E_LEFT_GAME = 2
};
class GameState
{
public:
virtual ~GameState(){}
virtual void cycle() = 0;
virtual void drive()=0;
GameState(Fsm* fsm)
{
m_fsm = fsm;
}
Fsm *m_fsm;
};
class IntoGameState : public GameState
{
public:
virtual void drive(Fsm *fsm)
{
m_fsm = fsm;
cout << "IntoGameState" << endl;
m_fsm->switch_state(E_LEFT_GAME);
}
};
class PlayGameState : public GameState
{
public:
virtual void drive(Fsm *fsm)
{
m_fsm = fsm;
cout << "PlayGameState" << endl;
m_fsm->switch_state(E_LEFT_GAME);
}
};
class LeftGameState : public GameState
{
public:
virtual void drive(Fsm *fsm)
{
m_fsm = fsm;
cout << "LeftGameState" << endl;
m_fsm->switch_state(E_INTO_GAME);
}
};
//然后添加一个管理这些类的管理类,也就是状态机
class Fsm
{
public:
add_state(E_GAME_STATE gameState , GameState *state)
{
state_map.insert(gameState, state);
}
switch_state(E_GAME_STATE gameState)
{
std::map<E_GAME_STATE, GameState *> it = state_map.find(gameState);
current_state = it->end();
current_state->drive(Fsm);
}
private:
std::map<E_GAME_STATE, GameState *> state_map;
GameState *current_state;
};
int main(){
Fsm *fsm = new Fsm;
GameState *intostate = new IntoGameState(fsm);
GameState *playstate = new PlayGameState(fsm);
GameState *leftstate = new LeftGameState(fsm);
fsm->add_state(E_INTO_GAME, intostate);
fsm->add_state(E_PLAY_GAME, playstate);
fsm->add_state(E_LEFT_GAME, leftstate);
fsm->switch_state(E_LEFT_GAME);
}
1
打赏
收藏
点击回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
