足球战术->球员状态之state篇

博客介绍在比赛中根据球员状态决定其表现可使用state模式,以球队为context,球员为state,教练为client。阐述了该模式的好处,如将特定状态相关行为局部化等,还给出了球队、球员等相关类的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上回:

http://www.youkuaiyun.com/develop/read_article.asp?id=11330

在比赛时根据球员的状态来决定他的表现,
可以使用state模式。其中球队是context,
球员是state,教练是client。好处是将特定
状态相关的行为局部化,并且将不同状态的
行为分割开来;使得状态转换显示化;而且
球员可以被多个教练(client)共享。
代码如下:
class 球队{
public:
    球队();
private:
    friend class 球员;
    void 改变状态(球员*);
private:
     球员* _状态;
};

class 球员{
public:
     //所有操作
protected:
     void 改变状态(球队*,球员*);
};

class 球员状态不佳:public 球员{
public:
    static 球员* 实例();

    virtual void 坐冷板凳(球队*);
};

class 球员状态很好:public 球员{
public:
    static 球员* 实例();

    virtual void 上场首发(球队*);
};

<think>我们分析的是以下代码片段: ```c void FSM_State_Update(FSM_Handle_t *FSM, state_e new_state) { FSM->next_state = new_state; // 设置目标状态 FSM->sub_state = EXIT; // 切换到EXIT子状态启动退出流程 } ``` ### 功能和作用分析 1. **函数功能概述**: - 该函数用于更新状态机的目标状态,并触发状态切换流程。 - 具体来说,它设置状态机的下一个目标状态(`next_state`)为传入的`new_state`,并将当前子状态(`sub_state`)设置为`EXIT`。 2. **参数解析**: - `FSM_Handle_t *FSM`:指向状态机控制结构体的指针,用于修改状态机的内部状态- `state_e new_state`:要切换到的目标状态(枚举值)。 3. **关键操作分析**: - `FSM->next_state = new_state;`: 将状态机的`next_state`字段更新为传入的`new_state`。这表示状态机将在后续处理中切换到该目标状态- `FSM->sub_state = EXIT;`: 将当前子状态设置为`EXIT`。根据状态机的设计,每个主状态都有三个子状态(ENTRY、RUN、EXIT)。将子状态设置为`EXIT`意味着当前主状态即将进入退出流程。 4. **状态切换流程**: - 当调用`FSM_State_Update`后,状态机的子状态变为`EXIT`。 - 在后续调用`FSM_Process`(状态机处理引擎)时,由于子状态是`EXIT`,会执行当前主状态对应的`EXIT`回调函数(例如`A_Exit`)。 - 在`EXIT`回调函数中,通常会执行资源清理操作,并更新主状态为目标状态(`next_state`),同时将子状态重置为`ENTRY`(表示准备进入新状态)。 - 因此,该函数是触发状态切换的起点,通过设置`next_state`和`sub_state`,引导状态机进入退出当前状态并切换到新状态的流程。 5. **设计意图**: - 解耦状态切换逻辑:将状态切换请求封装成独立函数,外部只需调用此函数指定目标状态,无需了解内部状态迁移细节。 - 确保状态切换的规范性:强制先执行当前状态的退出流程(EXIT),再进入新状态的初始化流程(ENTRY),符合状态机设计原则。 ### 总结 该函数是状态机进行状态切换的关键接口,通过设置目标状态并启动退出流程,确保状态迁移按照`ENTRY→RUN→EXIT`的规范流程执行,从而保证资源正确初始化和释放。 §§相关问题§§ 1. 在状态机中,为什么在设置目标状态后要立即将子状态设置为EXIT? 2. FSM_Handle_t结构体中的cbk数组是如何初始化的?在代码片段中未展示初始化过程,可能在哪里完成? 3. 如果调用FSM_State_Update函数时传入的new_state是当前状态,会发生什么?</think>### 代码分析:`FSM_State_Update` 函数 在这段状态机实现代码中,`FSM_State_Update` 函数是状态切换的核心控制接口,其作用如下: #### 功能解析 1. **触发状态迁移**: - 通过设置 `FSM->next_state = new_state`,将外部请求的新状态(如从状态A切换到状态B)暂存到状态机控制块中 - 这是状态切换的起点,但不会立即改变当前状态(`FSM->state`) 2. **启动退出流程**: - `FSM->sub_state = EXIT` 强制将子状态切换到退出阶段 - 这会触发当前状态的退出回调(如 `A_Exit`),执行资源清理等操作 3. **状态迁移流程控制**: - 配合 `FSM_Process` 调度器实现标准状态迁移流程: ``` EXIT当前状态 → ENTRY新状态 → RUN新状态 ``` - 在 `A_Exit` 中完成实际状态切换:`FSM->state = next_state` #### 设计特点 - **解耦设计**:外部只需调用此函数指定目标状态,无需了解内部状态迁移细节 - **安全切换**:通过子状态机确保每个状态都经历完整的退出/进入流程 - **异步切换**:状态变更请求被缓存(`next_state`),实际切换在后续`FSM_Process`中完成 ### 典型工作流程示例 ```mermaid graph TD A[调用 FSM_State_Update B] --> B[设置 next_state=B] B --> C[设置 sub_state=EXIT] C --> D[下次 FSM_Process 执行] D --> E[执行当前状态的 EXIT 回调] E --> F[在 EXIT 回调中更新实际状态] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值