【问题标题】:How to limit time of a player's turn in a socket.io game?如何在 socket.io 游戏中限制玩家的回合时间?
【发布时间】:2014-04-14 01:29:06
【问题描述】:

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

超时是我真正的问题。我做了一些简单的setTimeout 来推进转弯,如下所示:

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);
}

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

如果我只是在检查移动是否有效之前清除超时,我不知道如何在出现无效消息的情况下恢复计时器(即玩家在轮到他之外发送了一条文本,可能是通过摆弄客户端代码/控制台)。

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

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

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

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

    【讨论】:

    • 在完美的世界里这很好,但是如果错误的玩家发送了消息怎么办,我将如何恢复之前的超时?在这种情况下,我不能只进入下一个回合。
    • 包装所有消息处理程序代码(包括clearTimeout(timer)if (message.playerId === players[playerIndex].id) 这样的玩家检查。只需修改它,使用正确的变量将消息的玩家ID 与当前回合的玩家ID 进行比较。跨度>
    • 是的,我认为这就是答案。我仍然担心一些极端情况(比如玩家在最后一秒发送数据时),但我想我必须现场测试它是否会发生。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多