(披露:我对Rails很新)
我正在尝试在Rails中制作一个RISK风格的棋盘游戏,尽管这个问题可能适用于任何MVC风格的框架。
我有玩家和游戏。玩家可以加入游戏直到游戏结束。试图加入一个完整的游戏(或同一个游戏两次)发出错误信号,yada yada。
下面是三段游戏逻辑,我不确定在哪里放置,或者至少放置它们的位置。
如果游戏已满,它应该开始并做与之相关的事情(即,向游戏开始的所有玩家发送消息,随机地将军队分散到地图上)。
当玩家在回合中执行动作时,在控制器中拥有该逻辑似乎是合理的。他的回合何时结束,是时候向下一位玩家发消息呢?该代码是否与
假设一名球员在24小时内没有完成比赛,就会失去转身。我需要定期查看我的应用中的所有游戏,看看玩家是否超过24小时前开始转弯。这个逻辑会去哪里?
我的问题是:上述项目的逻辑在哪里进入Rails / MVC应用程序?
从某种意义上说,我可以将除3.
之外的所有内容填充到最后完成操作的控制器中。例如,我可以将1.
的逻辑放在播放器 - 连接 - 游戏控制器方法中(检查每个玩家加入后游戏是否已满,如果是,则开始1.
相关逻辑)。这似乎可能是错误的地方,但也许这就是通常的方式。
答案 0 :(得分:4)
Rails的惯例是“胖模型,瘦控制器”。所以我建议游戏的状态应该由游戏模型保存。
你的webapp由零个或多个游戏组成,每个游戏由一个或多个玩家组成。
“完整”的状态,或“游戏开始”的状态是游戏的属性,应该由该模型持有。
因此,对于1)当最终玩家加入(或者可能是所有当前玩家投票开始游戏)时,游戏状态(游戏的属性)将被设置为“已开始”,即保持当前活动的属性玩家将被设置,并且delayed job将排队以向所有玩家发送消息。
对于2,游戏在游戏控制器中具有“执行移动”方法,该方法将检查执行移动的玩家是否是当前玩家,然后它将针对游戏模型执行移动。内部的游戏模型将知道移动是否有效,结果是什么,以及下一步将是什么。它会再次使用类似延迟作业的信息向下一位玩家发送消息。
对于#3,同样可以设置延迟作业来执行超时。我不是100%关于如何安排延迟工作,或者是否有另一个更好的工作的宝石/插件。但是,这项工作会在游戏控制器上调用一种方法来检查游戏在所需时间的状态。如果玩家没有移动,那么执行你的forfit逻辑,这将再次成为游戏模型中的一种方法。
我认为每个玩家的状态可以保持在玩家模型中,或者在游戏模型中,取决于游戏,以及玩家模型之间可能存在多少交互。
在风险游戏的情况下,我认为玩家模型会相当薄,因为董事会的状态更多地是关于哪个玩家拥有一个国家,以及他们拥有多少军队 - 这更像是一个状态游戏,然后是每个玩家的状态。我希望风险游戏中的玩家模型更倾向于关于实际玩家的元数据 - 用户名,赢/输,技能等等。
在诸如Supremacy之类的游戏中,玩家拥有资源,核武器等,然后在玩家模型中存储更多数据。