2

我正计划编写一个小型网络应用程序,两个玩家可以在其中玩带有闪电战时间控制的国际象棋游戏。以下是对移动过程如何工作的简短描述:

  1. 玩家 A 考虑采取什么行动
  2. 玩家 A 向我的服务器发送移动
  3. 我的服务器处理请求
  4. 我的服务器向推送服务器发送响应
  5. 推送服务器处理请求
  6. 推送服务器向玩家 B 发送响应
  7. 玩家 B 考虑采取什么行动

有意义的是,步骤 1 将在玩家 A 的分配时间运行,而步骤 7 将在玩家 B 的分配时间运行。我可以对其他步骤做些什么?有什么方法可以测量其他步骤花费了多少时间,并可能将结果添加到两个玩家的时钟中?

4

2 回答 2

2

如果不信任客户,这是无法做到的。

基本问题是具有低延迟的客户端可以假装具有高延迟以获得奖励时间。具有 100 毫秒往返延迟的客户端可能会假装拥有 3 秒的 RTT,并使用这种欺骗手段将 6.9 秒的移动变为 4 秒的移动。协议没有实用的方法来检测假装具有高延迟的客户端,除非客户端犯了错误(例如,当他们采取 1 秒的动作时要求 3 秒的延迟豁免)。

另一方面,如果您确实信任客户,您可以通过定期 ping 他们的机器并从他们的移动时间中扣除该时间来估计他们的 RTT。如果您真的信任客户,请让他们测量并报告移动数据的经过时间。

有很多方法可以管理这种信任/延迟惩罚权衡。您可以假设最小 RTT(50 毫秒?)并从所有内容中扣除。您可以将奖励时间放在时钟上。您可以选择面向用户的游戏是“安全”还是“宽容”。

于 2012-06-12T00:39:48.743 回答
0

我最终选择了 Thomas CG de Vilhena 的想法。总而言之: - 每个玩家的时间是从他被告知他必须比赛开始到他将移动发送到服务器时结束 - 当玩家被告知对手的移动时,调整对手的剩余时间- 为防止用户作弊,发送移动的 javascript 将被混淆,服务器响应将被加密 - 时间校正例程是必要的,以防玩家超过分配的时间 - (可选)每个玩家都可以使用一种机制来检测任何(不太可能的)作弊尝试,导致日志记录有望允许仲裁者决定作弊发生在哪一方

这确保了玩家会看到服务器尊重他的思考时间,并且没有玩家会遭受延迟。

于 2012-07-06T17:40:35.487 回答