【问题标题】:Handle a clock in multiplayer game在多人游戏中处理时钟
【发布时间】:2020-06-01 02:23:54
【问题描述】:

我正在开发一款快速游戏,其中玩家有一个方块(类似时钟)。

因此,我将游戏开始时以及每次移动的时间存储在数据库中,以便我可以轻松计算每个玩家移动所花费的时间。

我知道我不能相信客户会说对手的计时器何时结束,所以目前,我每秒都会检查每场正在进行的比赛的剩余时间。

我知道这是不可持续的,我想知道如何在服务器端检查正在进行的游戏是否因为一名玩家没有时间而结束。

所以,这就是我目前的做法:

  1. 我在游戏开始时(服务器时间)存储在数据库中
  2. 我将每个动作都存储在数据库中,以及动作的时间(服务器时间)
  3. 客户端在移动后通过套接字更新剩余时间
  4. 客户端更新时钟(仅用于显示)。

  5. 每秒,我计算服务器端:

    • 从第一手到开始游戏的时间,从第二手到第三手的时间等,了解第一个玩家每一步玩了多少次
    • 我对第 2 名玩家做同样的事情,第 1 步和第 2 步、第 3 和第 4 步之间的时间等等...
  6. 当一名玩家经过的时间超过允许的时间时,服务器会发送(通过套接字)游戏结束。

我想知道我怎么能不计算每一秒,因为我希望服务器在没有人连接到游戏时更新结果。

谢谢。

【问题讨论】:

  • 只需在服务器端构建您的时钟逻辑。
  • 你能解释一下吗?这是我第一次这样做,不知道如何...... Tu
  • Roko 的意思是使用你的服务器时间作为事实的来源,所以你不必那么依赖客户端时间。这可以通过许多不同的方式来完成。如果您提供有关当前设置的更多详细信息,将会有所帮助。但是你有没有问过自己这个游戏是否真的需要这样的精度?也许在客户端计算时间毕竟可以正常工作。
  • 我在问题中添加了更多信息。

标签: javascript mysql node.js typescript


【解决方案1】:

你不仅不能信任客户端时钟,而且你也不需要。

正如@Roko-c-buljan 所说,构建您的计时器/时钟逻辑服务器端。每走一步,两个玩家都会“同步”,并将在本地启动他们的计时器。如果您有与服务器的流式连接,则服务器可以通知两个客户端计时器已结束并让另一个玩家移动。

这样,如果有一个破解的客户端,服务器将在轮到另一个客户端时简单地忽略该移动。

【讨论】:

  • 您知道如何执行此服务器端逻辑吗?我使用 websockets 来传递从客户端到服务器的移动以及从服务器到客户端的更新。
  • 如果您的游戏可以被视为国际象棋游戏(类比,因为您的问题没有足够的信息),那么:如果您不需要时间来处理动作及其瞬间,只需发送每次超时/转弯时给两个玩家的时间戳(如果需要,微秒)
  • 如果有帮助,我会在问题中添加更多信息。
  • 所以看来你不需要每一步都超时,而只需要一个总时间,如果总时间过去了就停止游戏?如果是这样,只需每分钟运行一次检查,计算速度非常快。数据库可以在 1 个查询中检索总数
猜你喜欢
  • 2013-09-10
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多