2

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(50ms?)を想定し、それをすべてから差し引くことができます。あなたは時計にボーナス時間を置くことができます。ゲームのユーザー向けオプションを「安全」と「寛容」にすることができます。

于 2012-06-12T00:39:48.743 に答える
0

結局、Thomas CGdeVilhenaのアイデアに行きました。要約すると、-各プレーヤーの時間は、プレイする必要があることを通知されてからサーバーに移動を送信したときに終了します-対戦相手の残り時間は、プレーヤーが対戦相手の移動を通知されたときに調整されます-ユーザーが移動を送信するJavaScriptをだまさないようにするために、サーバーの応答が難読化され、サーバーの応答が暗号化されます-プレーヤーが割り当てられた時間を超えた場合に備えて、時間修正ルーチンが必要です-(オプション)各プレーヤーが検出するメカニズムを利用できます(ありそうもない)不正行為の試み。結果として、不正行為がどちら側で発生したかをアービターが決定できるようになることを期待してログに記録します。

これにより、サーバーが自分の思考時間を尊重していることをプレーヤーが確認でき、ラグに悩まされることはありません。

于 2012-07-06T17:40:35.487 に答える