我正计划编写一个小型网络应用程序,其中两名玩家可以玩闪电战时间控制的国际象棋游戏。以下是关于移动过程如何运作的小描述:
有意义的是,第1步将在玩家A的指定时间内运行,第7步将在玩家B的指定时间内运行。我可以对其他步骤做些什么?有没有办法测量其他步骤花了多少时间,也许可以将结果添加到两个玩家的时钟?
答案 0 :(得分:2)
如果不信任客户,就无法做到这一点。
基本问题是,具有低延迟的客户端可以假装具有高延迟以获得奖励时间。具有100ms往返延迟的客户端可能假装具有3s RTT并使用此欺骗将6.9s移动变为4s移动。除非客户端犯了错误(例如,当他们花费1秒进行移动时要求3秒延迟豁免),否则协议无法检测到假装具有高延迟的客户端。
另一方面,如果您确实信任客户,您可以通过定期ping他们的机器并从他们的移动时间中扣除该时间来估算他们的RTT。如果确实信任客户端,请让他们测量并报告移动数据的已用时间。
有很多方法可以管理这种信任/延迟 - 惩罚权衡。您可以假设最小RTT(50毫秒?)并从所有内容中扣除。你可以把奖金时间放在时钟上。你可以让面向用户的游戏选项“安全”而不是“原谅”。
答案 1 :(得分:0)
我最终选择了Thomas C. G. de Vilhena的想法。综上所述: - 从他被告知必须播放时开始测量每个玩家的时间,并在他将移动发送到服务器时结束 - 当玩家被告知对手的移动时,调整对手的剩余时间 - 防止用户欺骗发送移动的javascript将被混淆,服务器响应将被加密 - 如果玩家超过分配的时间,则需要时间校正程序 - (可选)每个玩家都可以使用一种机制来检测任何(不太可能的)作弊行为,从而导致记录,希望仲裁者可以决定作弊发生在哪一方
这可以确保玩家看到服务器尊重他的思考时间,并且没有玩家会受到延迟的影响。