定期更新所有用户的游戏状态

时间:2014-02-28 22:03:32

标签: ruby-on-rails ruby background-process poker

我正在用红宝石写一个扑克室游戏。我想设定一个时间限制,每个玩家必须决定他们的游戏时间,在游戏结束时,游戏将决定接下来会发生什么。 (这个特定的玩家是否超时?大家都弃牌了吗?这是游戏的结束吗?等等)

我想用JS来判断用户端服务器上发生了什么,但是如何让服务器运行后台任务,每N分钟推进一次游戏状态? (每个扑克室的价值可能不同)

2 个答案:

答案 0 :(得分:1)

这是一个非常难以解决的问题。这可能是解决它的最简单方法之一。使用后台调度。例如sidekiq

您可以安排作业更新游戏状态,如:

class GameTimoutTrigger
  include Sidekiq::Worker

  def perform(game_id)
    game = Game.find(game_id)
    game.timeout!
  end
end

当游戏开始时,您会安排超时触发

round_timeout = game.round_interval
GameTimoutTrigger.perform_in(round_timeout, game.id)

请注意,sidekiq将按时间间隔(默认为15秒)轮询计划中的作业。因此,超时总会有一些延迟。

例如,如果循环时间必须始终精确为60秒,则可以保存循环开始和停止时间戳以及用户的操作时间戳。并且只接受用户操作,如果它在圆形范围之间。但这可能没有必要。这只是一个抬头。

答案 1 :(得分:0)

你使用setInterval()得到了正确的想法。

window.setInterval("javascript function",milliseconds);

“javascript函数”可以在客户端更新游戏并向服务器发出更新请求。如果要阻止该函数运行,请确保clearInterval()。

如果您真的在寻找一种方法让服务器运行后台任务,您可以尝试使用delayed-jobs gem,但websockets或setInterval可能是更好的方法。