我正在用红宝石写一个扑克室游戏。我想设定一个时间限制,每个玩家必须决定他们的游戏时间,在游戏结束时,游戏将决定接下来会发生什么。 (这个特定的玩家是否超时?大家都弃牌了吗?这是游戏的结束吗?等等)
我想用JS来判断用户端服务器上发生了什么,但是如何让服务器运行后台任务,每N分钟推进一次游戏状态? (每个扑克室的价值可能不同)
答案 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可能是更好的方法。