ruby-on-rails - Rails 应用程序中的游戏逻辑在哪里?

标签 ruby-on-rails model-view-controller ruby-on-rails-3

(披露:我对 Rails 非常陌生)

我正在尝试在 Rails 中制作 RISK 风格的棋盘游戏,尽管这个问题可能适用于任何 MVC 风格的框架。

我有玩家和游戏。玩家可以加入游戏,直到游戏满员为止。尝试加入完整的游戏(或同一游戏两次)会发出错误信号,yada yada。

下面是三个游戏逻辑,我不确定放置在哪里,或者至少不确定它们通常放置在哪里。

  1. 如果游戏已满,它应该开始并执行相关操作(即向所有玩家发送游戏已开始的消息,在 map 上随机分散军队)。

  2. 当玩家在他的回合中执行移动时,在 Controller 中拥有该逻辑似乎是合理的。当他的回合结束并且该向下一位玩家发送消息时该怎么办?该代码是否会与

  3. 放在同一个 Controller 中
  4. 假设如果玩家在 24 小时内没有完成该回合,则该玩家将放弃该回合。我需要定期查看应用程序中的所有游戏,看看玩家是否在 24 小时前开始玩游戏。这个逻辑会去哪里?

我的问题是:Rails/MVC 应用程序中上述项目的逻辑在哪里?

从某种意义上说,我可以塞满除 3. 之外的所有内容。进入 Controller 以获取最后完成的操作。例如,我可以放置 1. 的逻辑在player-joins-game Controller 方法中(每个玩家加入后检查游戏是否已满,如果已满,则开始1.相关逻辑)。这看起来可能是错误的地方,但也许这就是通常的做法。

最佳答案

Rails 的惯例是“胖模型,瘦 Controller ”。所以我建议游戏的状态应该由 Game 模型来保存。

您的网络应用程序由零个或多个游戏组成,每个游戏由 1 个或多个玩家组成。

“完整”状态或“游戏开始”状态是游戏的属性,应该由该模型保存。

因此,对于 1) 当最终玩家加入时(或者可能是所有当前玩家投票开始游戏),游戏状态(Game 的属性)将设置为“begin”,该属性保存当前事件状态玩家将被设置,并且 delayed job将排队向所有玩家发送消息。

对于 2,游戏在游戏 Controller 中有一个“执行移动”方法,该方法将检查执行移动的玩家是否是当前玩家,然后它将针对游戏模型执行移动。游戏模型内部会知道该举动是否有效、结果是什么以及下一步是什么。它会再次使用延迟作业之类的东西来向下一个玩家发送消息。

对于#3,同样可以设置延迟作业来执行超时。我不是 100% 知道如何安排延迟的工作,或者是否有另一个 gem/插件可以更好地工作。但是,该作业将调用游戏 Controller 上的方法来在所需的时间检查游戏的状态。如果玩家没有移动,则执行您的 forfit 逻辑,这又是游戏模型中的一个方法。

每个玩家的状态可以保存在 Player 模型中,或者保存在 Game 模型中,我想,这取决于游戏以及 Player 模型之间可能有多少交互。

在风险游戏的情况下,我认为玩家模型会相当薄弱,因为董事会的状态更多地是关于哪个玩家拥有一个国家,以及他们在那里有多少军队 - 这更多是一种状态游戏,然后是每个玩家的状态。我希望风险游戏中的玩家模型更加面向有关实际玩家的元数据 - 用户名、胜利/失败、技能水平等。

在像霸权这样的游戏中,玩家拥有资源、核武器等,那么玩家模型中需要存储更多数据。

关于ruby-on-rails - Rails 应用程序中的游戏逻辑在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453449/

相关文章:

html - 如何在我的 Rails 应用程序中将网页另存为图像?

ruby-on-rails - Rails : How do I get only the saved models with . 集合?

ruby-on-rails - twitter-bootstrap-rails 基本字体大小和行高

javascript - 数据表: click on button does not open view

ruby - 没有路由匹配 "/ciudades"

ruby-on-rails - 在访问 Omniauth 路由之前验证 Devise 用户

java - 使用 Spring MVC 从 JSP 获取值

ruby-on-rails - Rails 3 caches_page 写入文件但不会在后续命中时从缓存中读取

ruby-on-rails-3 - 通过 rake 运行 rspec 测试时在装饰器中获取未初始化的常量(NameError)

model-view-controller - 澄清 :MVC, MVP,MVVM