3

websocket を使用して、node.js の上にリアルタイム ターン ベースの戦略ゲーム サーバーを作成する予定です。html5 を適切にサポートする最新のブラウザーに対応する予定であり、下位互換性についてはあまり考慮していません。

提供されるゲームは、一度に少数のプレーヤー (たとえば 2 ~ 10 人) によってプレイ/観察され、チェスで使用され、www.chess.com で実装されているクロック タイマーを備えています。制限時間のあるゲームは最大で 1 時間続きます。制限時間のないゲームをプレイするオプションもあります。

サーバーは、プレイヤーの評価、プレイヤーのフレンド リスト、実行中/終了したゲーム状態の管理、およびゲーム クロックの実行を処理します。ゲームの状態はほんの少しの json で、1 ゲームあたりせいぜい数キロバイトです。

制約の 1 つは、実際のゲーム ロジックはすべて、サーバーではなくクライアントで実行する必要があることです。このため、クライアントまたはその対戦相手が誤動作している/悪意があるためにクライアントが違法な動きを通知した場合、無関係のクライアント (つまり、私のサイトを使用している他の誰か) がゲームの状態をロードするメカニズムが必要です。彼らのブラウザはバックグラウンドにあり、論争はそこで解決されます。

それは私の要件を要約しています。

これはおもちゃのプロジェクトではなく、多くのユーザーを獲得したいと考えているため、バックエンドのアーキテクチャとスケーラビリティを前もって考えたいと思います。私は一般的にnode.jsまたはWebサイトの展開について特に知識がありません。そのため、visアーキテクチャ、テクノロジー/ライブラリ、スケーラビリティ/プロキシ/ロードバランシング、クロックの実装方法、およびレイテンシの問題への対処方法に関するアドバイスや洞察、どこで/ゲームの状態の保存方法など、よろしくお願いします。

4

3 に答える 3

1

Node.js とその人気のあるライブラリは、スケーラビリティを念頭に置いて作成されているため、express、mongodb/redis、socket.io などの汎用ツールで十分に機能します。

クライアント側のロジックについて:

関係のないクライアント (つまり、私のサイトを使用している他の誰か) は、ゲームの状態をバックグラウンドでブラウザーにロードし、そこで論争が解決されます。

node.js の優れた点の 1 つは、ブラウザーと同じ JavaScript であることです。:) したがって、サーバーで同じコードを実行して、そこで論争を解決できます。

于 2012-05-09T03:25:34.193 に答える
0

ゲームコードが「信頼できない」理由はありますか?JSON入力を検証し、移動がルールに違反していないことを確認するだけです。詳細を知らなければ、クライアント間の紛争を解決する方法についてアドバイスできるかどうかはわかりませんが、ゲームコードが信頼できない理由はわかりません。

この問題は、実際には、分散衝突の検出と解決について読んだ論文と同じように聞こえます。これにより、サーバーネットワークのストレスが軽減されます。これは、すべての「クライアント」に、各クライアントが直接、予測可能な将来の状態に投票させることによって実現されます。競合がない場合は、合意に達し、ゲームが続行されます。競合があり、合意に達することができない場合、移動は中止されます。

また、投票が「時間内に」完了するかどうかについてのいくつかの興味深いアイデアを提供します(ゲームがターンベースである場合、このシナリオを処理する必要がない場合があります)。

衝突に到達できないときに移動を中止する代わりに、移動が有効かどうかを判断するためのロジックを作成する必要があります。サーバー(ゲームコード自体も信頼できない)以外は何も信頼できないように見えるため、ここで質問に答えるのが難しくなります。

この問題を確実に解決するには、既存のアイデアの1つを使用する必要があると思います。サーバーでサンドボックスゲームを起動するか、無関係のクライアントに質問するか(これは信頼できない可能性があります)、制約の1つを削除します。 、サーバーに直接問い合わせます。

于 2012-05-09T19:37:11.407 に答える
0

プロジェクトで最初に行うことは、技術要件のリストをまとめることです。投稿に書いた内容に基づく例を次に示します。

  1. 「servers will take care of[...]」 - 投稿の項目のリストは、何らかのユーザー ログイン認証メカニズムが必要であることを示しています。
  2. 「プレイヤーの評価、プレイヤーのフレンド リスト」 - これらは何らかのデータベースに保存する必要があります。
  3. 「実行中/終了したゲーム状態の管理、ゲーム クロックの実行」 - 実行中のセッションに接続されたプレーヤー間のリアルタイム データ処理。
  4. 試合の結果を保存する予定がある場合は、リアルタイム アプリケーションをデータベース ストレージに接続する必要があります。
  5. 「実際のゲーム ロジックはすべてクライアント上で実行する必要があります」 - Browser Questを見たことがありますか? このゲームの大きな問題は、すべてのユーザー情報がクライアントに保存されることです。ゲーム内のすべての特典を取得するには、localStorage を手動で編集する必要がありました。これを回避するために私が考えることができる唯一の方法は、ゲーム ロジック全体をブラウザーにコーディングし、接続されているすべてのクライアントで各動きを検証することです。しかし、これは、ユーザーが論理を変更して、合法であるべき動きに異議を唱える可能性があるという問題を引き起こします。

プロジェクトの技術的要件の明確なリストがあれば、探しているライブラリを見つけるのがずっと簡単になります。たとえば、socket.io は、Web ソケットを処理するための優れたライブラリです。

于 2012-05-09T03:26:46.457 に答える