关于javascript:在socket.io游戏中如何限制玩家的回合时间?

How to limit time of a player's turn in a socket.io game?

我正在尝试使用socket.io模块在node.js中制作一个基于文本回合的简单游戏。玩家必须有超时才能在回合中发送文本。如果他不这样做,他将失去机会,现在轮到下一位玩家了。

超时是我真正的问题。我做了一些简单的setTimeout来推进转弯,就像这样:

1
2
3
4
5
6
7
8
9
10
11
var playerIndex = 0;
var timer = setTimeout(advancePlayer, turnTime);

function advancePlayer() {
    playerIndex = (playerIndex + 1) % numPlayers;

    // Warns the players about whose turn is now:
    aknowledgeTurn(playerIndex);

    timer = setTimeout(advancePlayer, turnTime);
}

问题在于,当玩家发送文字时,我需要首先检查是否该轮到他了(这是一个相关问题,因为我不确定如何在所有玩家之间共享游戏实例/数据,并且现在我正在使用数据库),这可能会花费足够的时间使计时器用完并调用下一轮,从而使移动无效或可能跳过下一轮的玩家,因为一旦收到文本,计时器就应该停下来,转弯应该前进。

如果我只是在检查移动是否有效之前清除超时,我将不知道如何在出现无效消息的情况下恢复计时器(例如,玩家在回合以外发送了文本,也许是通过与客户摆弄代码/控制台)。

当播放器发送消息时如何关闭超时时间而不会陷入这些问题?


收到动作后,可以使用clearTimeout(timer)取消当前计时器。

然后,在处理了该玩家的移动之后,只需从移动处理程序代码中调用advancePlayer()。这将前进到下一个播放器并设置一个新计时器。