0

PHPでマルチプレイヤーゲームを構築しています。各ゲームは、設定された時間(現在は2分)続くステージに分割されます。各ステージでは、ゲームが次のステージに進むか、ステージ(つまりゲーム)が失われ、新しいゲームが再開されるまで、プレーヤーは一定時間一緒に作業します。

私は、HTMLページでゲームをプレイするというビジョンを持っています。このページでは、ユーザーは、絶えず更新されるカウントダウンクロックを通じて、現在のステージの残り時間を確認できます。カウントダウンクロックがゼロに達すると、ゲームが進行または終了し、結果がAjaxを介して返されます。私が問題を抱えているのは、100人のプレイヤーが同時にゲームをプレイするという(理論上の)考えです。

更新スクリプトを呼び出すにはどうすればよいですか?PHPを実行して呼び出す場合、どのプレーヤーのブラウザーがそれを呼び出しますか?ステージが実際に終了する1秒前にプレーヤーのブラウザがコンテンツを更新すると、どうなりますか?

PHPはこのようなゲームに適した言語ですか?

4

3 に答える 3

1

「PHPはこのようなゲームに適した言語ですか?」はい、あなたがそれを正しく行えば。これがあなたのやり方です...

Cometと呼ばれる方法を使用すると、複数のクライアントがサーバーからデータをプルすることができますが、そのデータが更新された場合に限ります。これは次のように機能します。

  1. クライアントAはサーバーにプルリクエストを行います。
  2. サーバーは待機し、クライアントAへの接続を開いたままにします。
  3. クライアントBはサーバーにプルリクエストを行います。
  4. サーバーは待機し、クライアントBへの接続を開いたままにします。
  5. クライアントAは新しいデータをサーバーにプッシュします。
  6. サーバーは、開いたままの接続を介して新しいデータをクライアントAとクライアントBにプッシュします。
  7. クライアントAがプルリクエストを行います...
  8. 等...

つまり、すべてのクライアントが最新の情報をすぐに受信し、それが任意のクライアントによってサーバーにプッシュされることを意味します。これは、「x秒ごとに更新」システムを実装する必要がないことを意味します。これは2つの理由で有効です。

1)何も起こらなかったときに、時間と帯域幅を無駄にサーバーに要求しないでください。2)すべてのクライアントが同時にデータをプッシュします。これは完全に最新であり、x秒前ではありません。

実際には、CometはAJAXを介して実装されます。コメットのいくつかの例のためのグーグル-それは非常に単純で、非常に便利です。

于 2012-07-18T16:04:50.400 に答える
1

クライアント/サーバーゲームでは、サーバーはクライアントのシミュレーション(ゲーム)と並行してシミュレーションを実行する必要があります。

通常、サーバーシミュレーションは信頼できるものであるため、たとえば、一致が終了すると、シミュレーションの状態が「一致」などに変更されたことを、一致するすべてのクライアントに通知します。次に、クライアントはUIをロックするか、「ゲームオーバー」メッセージを表示するか、勝者をアナウンスします。

したがって、クライアントが状態の変化についてサーバーをポーリングし続けている間(AJAXまたはWebSocketを介して)、サーバーはカウントダウンタイマーを実行する必要があります。サーバーのタイマーがゼロに達すると、次にクライアントがサーバーをポーリングするときに、サーバーは「ねえ、よー、ゲームオーバーだ!」と言います。

編集

PHPはおそらく機能するだろうと言いたいのですが、PHPはゲームではなくWebサービス用に構築されていることを理解する必要があります。三目並べやチェッカー、チェスなどの単純なゲームは、マルチプレーヤー機能を使用すると非常に複雑になる可能性があります。多くの場合、シミュレーションにはスレッド化が必要です。PHPはスレッド化を行うことができますが、何をしているのかわからない場合は非常に醜くなる可能性があります。

于 2012-07-18T15:54:28.713 に答える
0

PHPセッションシステムを使用している場合、スクリプトはAjaxリクエストを(たとえば)ゲームにログインしたのと同じユーザーからのものとして認識します。

ステージが終了する1秒前に、PHPでステージに残っている時間を返して、javascriptカウンターの同期を維持することができますか?サーバーとクライアントの両方がゲームのステータスを認識している必要があります。そうでない場合は、いつかハッカーを予期します。

于 2012-07-18T15:54:56.977 に答える