为什么你的if-else越写越乱?聊聊状态机

张开发
2026/5/4 11:03:35 15 分钟阅读
为什么你的if-else越写越乱?聊聊状态机
状态机是什么一句话定义状态机把对象的所有可能情况分成互斥的几种状态明确规定状态之间如何切换。本质上是对实际情况的一种分类讨论。为什么需要状态机状态机解决的是同一个对象在不同状态下对同一输入的不同响应问题。想象一个游戏场景你操作的角色需要进行不同的动作。 假设角色有这些状态站立、跑步、跳跃、攻击、受击刚开始的时候你打算用if-else来解决先来定义几个变量保存这些状态python体验AI代码助手代码解读复制代码is_jumping Falseis_attacking Falseis_running Falseis_hurt Falseis_standing False根据不同状态进行不同形态的攻击python体验AI代码助手代码解读复制代码def on_attack_button():if is_jumping and not is_attacking and not is_hurt:do_air_attack()elif is_running and not is_attacking and not is_hurt:do_dash_attack()elif is_standing and not is_attacking and not is_hurt:do_normal_attack()# 还要考虑29种其他组合的合理性问题来了5个布尔变量理论上有322^5种组合但跳跃中同时受击同时攻击合法吗每加一个状态组合数翻倍漏掉一个判断就出bug状态机要素状态机的要素分为4个要素即现态、条件、动作、次态。 “现态”和“条件”是因“动作”和“次态”是果。1现态是指当前所处状态2条件又称为“事件”。当条件被满足时将会触发一个动作或者执行一次状态的迁移。3动作条件满足后执行的动作。动作不是必须的当条件满足后也可以不执行任何动作直接迁移到新状态。4次态条件满足后要迁移往的新状态。“次态”是相对于“现态”而言的“次态”一旦被激活就转变成新的“现态”了。用状态机来解决这个问题核心思路任何时刻角色只能处于一个状态因此很自然的我们定义一个变量表示角色的状态python体验AI代码助手代码解读复制代码state 站立 # 只有一个变量从状态到状态的转换我们也需要定义状态现态状态描述条件事件动作次态站立默认待机状态按方向键播放跑步动画跑步按跳跃键播放跳跃动画跳跃按攻击键播放攻击动画攻击被打中播放受击动画受击跑步水平移动中松开方向键-站立按跳跃键播放跳跃动画跳跃按攻击键播放攻击动画攻击被打中播放受击动画受击跳跃空中状态落地-站立按攻击键播放空中攻击动画攻击被打中播放受击动画受击攻击攻击动作中动画结束-站立被打中播放受击动画受击受击受击硬直中硬直结束-站立最后我们来实现不同形态的攻击按攻击键python体验AI代码助手代码解读复制代码def on_attack_button():if state 站立:# 站立时的攻击do_normal_attack()state 攻击elif state 跑步:# 跑步时的攻击do_dash_attack()state 攻击elif state 跳跃:# 跳跃时的攻击do_air_attack()state 攻击# 其他状态按攻击键无效不用写对比布尔变量组合状态机5个状态最多32种组合要考虑只有5种情况加新状态所有if都要检查只加新状态的转换非法情况要手动排除根本不存在总结代码的核心思路转变就是从用多个变量组合描述状态到用单一变量明确状态核心难点是 如何定义状态 以做到互斥。延伸状态很多时几十个考虑分层状态机需要同时处于多个状态时考虑并行状态机实际项目中状态机常用字典映射或状态模式实现比if-elif更易维护原文链接https://juejin.cn/post/75840372

更多文章