这可以在状态机模式中建模吗?

时间:2014-03-22 15:56:12

标签: oop design-patterns

我想使用涉及以下状态的状态机设计模式来模拟游戏(出于练习原因):

  • 初始:游戏主持人使用一些配置参数设置游戏
  • 已发布:其他玩家可以看到该游戏,以便他们可以加入
  • 准备:一旦游戏已满(达到最多玩家数),主持人就可以开始游戏
  • 正在运行:游戏正在运行
  • 完成:游戏结束,玩家可以看到有关游戏的一些统计数据

但是,在阅读了状态机模式之后,在我看来它只适用于状态都暴露了一个公共接口(例如本文中的handleInput - 方法:http://gameprogrammingpatterns.com/state.html )。

我打算让游戏在初始状态下使用publish方法,这会将其引导到Published状态,然后它会有join方法,一旦有足够的玩家加入,它将引导它Ready,等等。

目标是在这里分开关注点,我不希望一个巨大的Game课程必须处理收集所有玩家以及处理实际的游戏逻辑。

这可以通过状态机完成吗?或者我可以使用其他任何设计模式吗?

1 个答案:

答案 0 :(得分:1)

states公开了一个通用界面,但这与您的实际游戏无关。

最低要求是将transitionsstate设置为下一个state,并根据之前的state创建结果transition的机制state。通用界面只涉及这方面。

对于您的初始GameConfig,主机会在GameLobby对象上设置一些值。按“发布”按钮即可转换到下一个状态。在转换处理程序上,您需要创建一个GameLobby对象。

GameLobby是根据游戏的名称和预期的玩家数量创建的,并且严格按照添加玩家和其他大厅相关功能(例如玩家聊天,也应该在他们自己的班级中实施)进行交易。

这里,每次玩家加入大厅时都会调用转换处理程序。只有当达到玩家总数时,才会转换到下一个状态“Game Ready”。 (如果玩家的数量还不等于要求,那么如果你想保持不变的话,可以用一个额外的玩家转换到新的GameConfig对象。)

Player对象一起,此新状态包含GameLogic个对象的列表。

从此状态开始,当主机单击“Ready”时,在转换处理程序中,您最终会根据GameConfig对象和Player对象列表创建Init对象。

赢得游戏后,您将转换到“已完成”状态,其中包含游戏的统计信息以及最终转换为“结束程序”。

这些主要状态中的每一个都可以包含自己的状态机。

因此,与状态机相关的接口不会限制有效负载的接口。

我还建议您将与在屏幕上显示项目相关的部分与确定要显示的“内容”的部分分开。因此,每个状态对象都有类似sprites方法的东西,它们生成需要显示的{{1}}列表(并附加转换所需的任何事件处理程序)。然后,一个单独的对象将获取该列表并在屏幕上显示它并在用户输入上调用偶数处理程序。