2016-11-19 132 views
0

我在电报机器人中创建了一个游戏,现在我已经达到了“玩”状态。最困难的部分是每回合超时算法(对我来说)。游戏的超时逻辑

这里的故障:

赛首发..得到4名球员

游戏的目标是要回答的问题。问题是: 提及动物的名字。

顺序回答是:玩家C - >玩家B - >播放器d - >播放器 A.

每个玩家有最大5秒至回答(可以是更小)。

好吧,现在,游戏将在3 .. 2 .. 1 ..开始!

玩家C的答案:(1秒)

玩家B的答案:(1秒)

播放d答案:鹿(1秒)

播放器答案:(2秒)

当它回到播放呃C,它会是5秒,而我的逻辑是 来检查oldTurnId(Player C)=== currentTurnId(播放器 C)。在这种情况下,玩家C会收到通知时间到了,他将被送出,但是玩家C将会第二次回答。

I have this columns on my table : previousTurnId, currentTurnId, nextTurnId

但我找不到解决这个问题的方向。

仅供参考,我使用node.js来创建这个游戏,主要部分是我使用setTimeOut很多这个超时每转的逻辑。

任何人有更好的主意来解决这个问题?

非常感谢很多家伙, 所有帮助将不胜感激。

谢谢

回答

1

听起来像你想要的是一个clearTimeout。基本上,如果玩家在接下来的5秒内回答,你会清除超时时间,否则,你继续踢正常的游戏。您可以从setTimeout获取超时ID作为返回值。

我做你的代码的假设,但这主要是它会怎么走:

var playerTimeout = setTimeout(function() { 
    removePlayer(player); 
    startNextPlayersTurn(); 
}, 5000); 

player.on('answer', function() { 
    clearTimeout(playerTimeout); 
    startNextPlayersTurn(); 
}); 
+0

AHHHH,让人的想法,我不知道那件事。无论如何,感谢兄弟。稍后再尝试,并会更新结果。谢谢!! – Webster

+1

你的意思是在超时后传递一个参数给'setTimeout'调用的函数吗?你可以只包住'setTimeout'在功能'函数startPlayerTimeout(播放器){返回的setTimeout(函数(){removePlayer(播放器);},5000); }' – cejast

+0

还好,但如果我把它包起来,我不能使用从外部权clearTimeout功能? – Webster