我计划编写一个小型网络应用程序,两个玩家可以在其中玩带有 Blitz 时间控制的国际象棋游戏。以下是对移动过程如何进行的简要描述:
- 玩家 A 思考要采取什么行动
- 玩家 A 向我的服务器发送一步
- 我的服务器处理请求
- 我的服务器向推送服务器发送响应
- 推送服务器处理请求
- 推送服务器向玩家 B 发送响应
- 玩家 B 思考要采取什么行动
步骤 1 将在玩家 A 的分配时间内运行,步骤 7 将在玩家 B 的分配时间内运行,这是有道理的。对于其他步骤我能做什么?有什么方法可以测量其他步骤花费了多少时间,并且可以将结果添加到两个玩家的时钟中?
最佳答案
如果不信任客户端,这是无法完成的。
基本问题是低延迟的客户端可以假装具有高延迟以获得奖励时间。往返延迟为 100 毫秒的客户端可能会假装有 3 秒的 RTT,并利用这种欺骗将 6.9 秒的移动变成 4 秒的移动。协议(protocol)没有实用的方法来检测假装高延迟的客户端,除非客户端犯了错误(例如,当他们花了 1 秒的时间进行移动时,要求免除 3 秒的延迟)。
另一方面,如果您确实信任该客户端,您可以通过定期 ping 他们的计算机并从他们的移动时间中扣除该时间来估计他们的 RTT。如果您真的信任客户,请让他们测量并报告移动数据所用的时间。
有很多方法可以管理这种信任/延迟惩罚权衡。您可以假设一个最小 RTT(50 毫秒?),然后从所有内容中扣除该值。您可以在时钟上添加奖励时间。您可以让面向用户的游戏选项是“安全”还是“宽容”。
关于algorithm - 在在线国际象棋游戏中,如何最大程度地减少时间控制滞后的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965051/