【发布时间】:2015-09-26 23:28:02
【问题描述】:
我正在编写一个基于回合的纸牌游戏(在线扑克)。我有使用 Rails 的经验,所以我想将它用于大多数逻辑,例如使用硬币和统计数据管理用户、管理房间和游戏。我打算使用node js + socket.io + redis来提供实时消息服务器->客户端(基本上使用rails中的redis来发布消息,在node.js端监听它们并通过socket.io发布到客户端)和使用 REST API 从客户端 -> 服务器进行通信。
我坚持的部分是尝试管理 Rails 中的实际游戏逻辑。对于正在进行的每场比赛,我都需要一个游戏管理器来评估游戏中发生的所有事情(发牌、接受投注、通过玩家轮次、评估结果等)。有两件事对我来说似乎有点不可能,这是我迄今为止使用 Rails 构建 web 应用程序的经验:
将游戏管理器作为内存中的单个共享对象: 我在想这可能是一个 redis 缓存对象,并且会在每次状态更改时重新加载,并使用新状态再次保存,这似乎是一个很大的开销。 我正在考虑的另一件事是保存游戏管理器对象的哈希值,每个正在进行的游戏作为一个静态对象,可以从 rails 应用程序中的任何位置访问。我在这里缺少什么吗?这可以通过某种方式改进或任何其他方法来执行此类功能吗?
有一个计时器在等待玩家移动时会滴答作响 像任何基于回合的游戏一样,我需要等待特定的秒数,直到玩家做出反应,如果玩家在 20 秒内没有采取行动,那么服务器应该自动移动到下一个玩家。 我真的不知道如何在rails中做到这一点。我正在考虑的一种方法是延迟任务,该任务将在 20 秒后运行,如果用户在它之前采取行动,则玩家轮流或被取消。 (例如使用 sidekiq 来完成这些任务)。
编辑
我一直在设计如何实现实际的游戏逻辑,这就是我需要游戏管理器的原因,需要为每个活动游戏(至少有 2 名玩家的游戏)每 1 秒设置一个计时器,需要如果玩家没有轮到移动到下一个玩家,则在 x 秒后回调。由于每个请求的无状态性质,我不知道如何在 Rails 中做到这一点,我需要将游戏状态存储在内存中并以某种方式运行计时器。 我确实相信我可以解决 node.js 中围绕游戏逻辑的这个特定问题,但我宁愿使用 node.js 来管理套接字连接并通过 redis pub/sub 接收事件。
【问题讨论】:
-
不错 - 在 Rails 中制作回合制游戏是一个很棒的项目 :)
标签: ruby-on-rails ruby node.js multiplayer