跳转至

结合控制理论和状态机

要把状态与反馈回路联系在一起,首先你必须为每个 StateDefinition 对象提供访问已实现传感器和执行器(actuator)的通用方式。StateDefinition 类然后变成:

class StateDefinition {
public:
    StateDefinition(){}
    ~StateDefinition(){}
    bool condition(GameSensors* sensors);
    void reach(GameSensors* sensors, 
GameActuators* actuators);
};

这个更改只是修改 condition() 和 reach() 函数,接受 GameSensors 和 GameActuators 类的实例作为参数。GameSensors 和 GameActuators 是需要你定义的类;GameSensors 将包含内存读取、网络钩子和机器人从游戏拦截的其他数据源的结果,而 GameActuators 将是能够在游戏内执行动作的动作函数集合。

接下来,你需要定义每个单独状态的通用方式。你可以把每个状态的定义抽象成继承 StateDefinition 并实现虚函数 condition() 和 reach() 的独立类。或者,如果源代码需要适合小空间(比如一本书,眨眼),你可以保留单类表示每个定义,用 std::function 在类定义之外实现 condition() 和 reach() 函数。

按照那种替代方法,StateDefinition 的最终版本看起来像这样:

class StateDefinition {
public:
    StateDefinition(){}
    std::function<bool(GameSensors*)> condition;
    std::function<void(GameSensors*, 
GameActuators*)> reach;
};

有了这个版本的 StateDefinition 类,你可以通过创建类实例并把 condition() 和 reach() 赋值给与预期行为对应的函数来定义新状态。