c++ 实现一个状态机 一共3个状态 1秒后自动切换状态 不能使用 switch case 语句,每个状态做一件惊天动地的事 第100次状态切换一定要是状态3 第2221次切换后状态机增加21个状态 并删除之前3个状态中的一个
时间: 2024-02-07 22:02:30 浏览: 35
状态机的应用 (c++编程或算法设计帮助)
4星 · 用户满意度95%
好的,根据你的要求,我对上述代码进行了修改,实现了一个更加复杂的状态机。具体实现如下:
```c++
#include <iostream>
#include <functional>
#include <chrono>
#include <thread>
#include <vector>
#include <algorithm>
class StateMachine {
public:
typedef std::function<void()> StateFunc;
StateMachine() : m_curState(0), m_count(0), m_isAddState(false) {
m_stateFuncs[0] = std::bind(&StateMachine::state1, this);
m_stateFuncs[1] = std::bind(&StateMachine::state2, this);
m_stateFuncs[2] = std::bind(&StateMachine::state3, this);
}
void run() {
while (true) {
m_stateFuncs[m_curState](); // 执行当前状态的行为
std::this_thread::sleep_for(std::chrono::seconds(1)); // 1秒后切换状态
m_curState = (m_curState + 1) % (m_isAddState ? 24 : 3); // 如果已经添加了21个状态,则状态总数为24,否则为3
if (++m_count == 100) { // 第100次状态切换一定要是状态3
m_curState = 2;
}
if (m_count == 2221) { // 第2221次状态切换后增加21个状态并删除之前3个状态中的一个
m_isAddState = true;
for (int i = 0; i < 21; i++) {
m_stateFuncs.push_back(std::bind(&StateMachine::newState, this));
}
m_stateFuncs.erase(m_stateFuncs.begin(), m_stateFuncs.begin() + 1); // 删除第一个状态
}
}
}
private:
void state1() {
std::cout << "状态1:吃饭" << std::endl;
}
void state2() {
std::cout << "状态2:睡觉" << std::endl;
}
void state3() {
std::cout << "状态3:打游戏" << std::endl;
}
void newState() {
std::cout << "新状态:干饭" << std::endl;
}
int m_curState; // 当前状态
int m_count; // 计数器,用于判断是否达到第100次状态切换和第2221次状态切换
bool m_isAddState; // 是否已经添加了21个状态
std::vector<StateFunc> m_stateFuncs; // 状态行为的函数指针数组
};
int main() {
StateMachine sm;
sm.run();
return 0;
}
```
在上述代码中,我们在原有的状态机基础上增加了一些功能。首先,在 `StateMachine` 类中增加了一个 `m_isAddState` 成员变量,用于判断是否已经添加了21个状态。其次,在 `run` 函数中,我们增加了一些逻辑,当计数器 `m_count` 达到2221时,就将 `m_isAddState` 设置为 `true`,然后使用 `std::vector` 动态增加21个新状态,并删除原来的3个状态中的第一个状态。最后,在 `main` 函数中,我们创建了一个 `StateMachine` 对象并调用了它的 `run` 函数,从而启动了状态机。
需要注意的是,由于我们使用了 `std::vector` 来存储状态行为的函数指针,因此在计算当前状态时,需要判断当前状态总数是3还是24。另外,由于我们删除了原来的3个状态中的一个,因此在计算当前状态时,不能简单地使用模运算,而是需要使用 `m_isAddState` 来判断当前状态总数。
阅读全文