我正在创建一个板球经理统计游戏。我需要创建一个逐球模拟的游戏。比赛/球的结果将受到球员统计数据和其他外部因素(例如天气或所选战术)的影响。
我一直在阅读,大多数游戏都可以作为状态机来实现,这听起来对我很有吸引力,但因为我是板球新手,所以我无法将这款游戏设想为状态机。
球应该是状态机、比赛、球员还是全部 3 个状态机。我也不确定如何编排这个状态机(通过事件)。
我也很难识别状态和转换。任何帮助将不胜感激。
所以这就是我从你的问题中了解到的 - 你的板球经理游戏将根据玩家统计数据(投球手的技能/经验、击球手的技能/经验、守场/守门统计数据等)和其他相关数据逐个模拟比赛球变量。根据我的理解,这将更像是一个算法引擎,而不是板球比赛的视觉表示。
现在回答你的问题,首先,我不认为你以正确的方式看待 FSM。 FSM 是一段代码,其设计使其在其生命周期的任何时刻都处于多种可能的执行状态之一。每个州都可以而且通常有(这就是重点)不同的更新例程。此外,每个状态都可以根据预定义的触发器/事件转换到另一个状态。您需要了解的是,国家对同一实体实施不同的行为。
现在,“大多数游戏都可以作为状态机来实现”——不是“一个”状态机,而是一整套状态机。游戏中的几个管理器类、渲染器、游戏对象、菜单系统,或多或少所有东西都在其自己的状态机上运行。出于本示例的目的,想象一个游戏角色,例如拳击手。您会在“CBoxer”(?)类中找到“Blocking”、“TakingHit”、“Dodge”、“RightUpper”、“LeftHook”等状态。
但请记住,FSM 更多的是一种设计构造——一种设想当前问题的解决方案的方法。您不必一定使用它们。你可以在没有状态机的情况下制作一个完整的游戏(我认为:))。但 FSM 使您的代码设计变得非常直观和直接,坦率地说,在任何规模合适的项目中都很难找不到 FSM。
我建议你看一下 FSM 工作中的一些代码示例。一旦你掌握了它背后的想法,你就会发现自己到处都在使用它们:)
作为第一步,您应该仔细阅读板球规则和球结果模型,以总结之前的球如何影响给定的球。
然后确定您需要跟踪什么,以及是否方便使用状态机来表示它。例如,作为 FSM,统计数据通常不太方便跟踪。
记住这些信息,您应该能够构建模型。您需要跟踪的信息可能是状态机或特定状态的内部值。球之间的相互作用将决定从一台机器到另一台机器的转换和事件循环。
一场板球比赛可以建模为具有不同状态和转换的状态机,以捕获游戏流程。这是一个简化版本:
主要州 赛前:比赛开始前,包括球队准备和阵容公布。 抛掷:抛硬币决定哪支球队先击球或先投球。 第一局:第一队击球,第二队投球和投球。 击球手状态:当前击球手击球或未击球。 投球手状态:当前投球手投球。 球状态:每个投出的球都是一个子状态(点球、跑球、三柱门等)。 局间休息:第一局和第二局之间的间歇,用于团队讨论和策略规划。 第二局:第二队击球,第一队投球和投球,与第一局的结构相同。 赛后:比赛结束后,包括宣布获胜者和赛后演讲。