2012-01-19 13 views
0

mysqlを使って効率的なターンベースのシステムを設計するためのガイダンスを探しています。要件とゲームの流れは、ゲーム「Friends with Words」と似ています。しかし、ここで私の頭の上オフシステムの要件は次のとおりです。戦いの統計を算出することができるので、ターンベースゲームのデータベース設計

  • は、それぞれの戦いの歴史を保存する必要があります。現時点では、これは単純に勝敗を決定するためのものです。

  • バトルの現在の状態は常に利用可能でなければなりません(ユーザーはアプリを閉じて、選択またはプッシュ通知で再開することが許可されている必要があります)。

  • 可能な限りデータベースの要求は最小限で効率的でなければなりません。潜在的に1秒あたりに多くのリクエストがあり、クライアントのベースが大きくなる可能性があります。

一般的なゲームの流れ:

  1. プレイヤーは確認のために待機し、その後、戦いに他のプレイヤーとターンタイムアウト値を選択します。
  2. 確認が成功した後、開始側のプレイヤーは自分のターンを行う必要があります。ターンをするということは、単純に攻撃/移動を選択することを意味します。
  3. ダメージダメージなどは、プレイヤーがターンして計算し、データベースに伝播します。プッシュ通知が送信され、他のプレイヤーに自分のターンであることを通知します。
  4. プロセスは、勝利条件が満たされるまで繰り返されます(特定のプレーヤーの健康状態が一定レベルになったとき、または自分のターンがタイムアウトしたときなど)。

誰でもデータベースに効率的に組み込む方法を提案できますか?

+0

この質問は、あまりにもStackOverflowに収まるように幅広いです。このような概念的な質問については、http://gamedev.stackexchange.comまたはhttp://programmers.stackexchange.comを参照してください。 –

+0

私はここに投稿するのが初めてです。私がgamedevにそれを移すことができるなら、私はそうするでしょう。 – Firefly

答えて

2

ゲーム:

ID - varchar型255(あなたのゲームが巨大であれば11自動インクリメントが不足する可能性がint型)
START_DATE - 日時
END_DATE - 日時
CURRENT_USERは - あなたが排出されます可能性がない(11 int型
map-int 10(持っているマップの数やランダムになっているかどうかによって異なります)
gamestate - この部分は、アプリケーションに状態を送信する方法に大きく依存します
トークン - varchar 50(認証するもの)

ID - varchar型255
game_id - varchar型255
のuser_id - 11
日時をint型:TINYINT 1(または列挙あなたが保留中の場合は、準備ができて、閉じた状態)

アクション -
状態)に対するenticate - datetime
アクション - tinyint 1(あなたが持っているアクションの数によります..列挙型攻撃、移動、守る、など)
データ - 行われたかについて、いくつかの詳細が、統計だけでなく、他のユーザーに

ユーザーに送信するために、このデータは次のとおりです。

ID - 11
int型ユーザ名 - (例えば)varchar型50
等... idは私たちがここで気に唯一のものですので、それほど重要ではありませんユーザー

私は等の基本的な考え方はInnoDB対符号なし、MyISAMのようなすべての詳細を説明する野生行くdidntのそれに関連するゲームデータとアクションリレーショナルテーブルを持つゲームテーブルを持つことですo後で統計やタイムラインなどを処理することができます。

ここで重要なのは、gamedataとtokenです。これらはゲームの間を行き来するためです。理想的には、トークンは、各ゲームに固有のアプリで比較するハッシュであるため、ユーザーはブラウザや何かを使用したり、ゲームのアップデートを投稿することはできません。これの背後には、現在重要ではないかもしれない他の哲学があります。

したがって、gamedataは、シリアル化された配列、テキスト、BLOBなどである必要があります。どのくらいのデータを渡し、どの形式であるかによって異なります。したがって、シリアル化されていない応答は、

[0] => [ // player 1 
    [0] => [ // army position and status 
     [0] => '2,2,98,1', //x, y, health, mode (1 => defense, 2 => offense, etc) 
     [1] => '120,10,45,2', // could also break down into another array layer 
     [3] => '222,155,100,1' 
    ], 
    [1] => [ // bases 
     [0] => '130,45,34', //x, y, health 
     [1] => '356,25,10' 
    ], 
    [2] => [ // game data 
     [0] => '12245' // money 
     [1] => '41324131232' // timestamp of when last turn began 
     [2] => 0 // bool whether or not they are up at bat 
    ] 
] 

のようになります。これはプレイヤー1のデータです。だから、あなたはこれをシリアライズして、それを暗号化することができます。しかし、これは私がgamestate分野にあるべきだと言っていることです。したがって、必要なデータ型を使用することになります。このデータ型は、ゲームそのものに関する詳細情報で明らかになります。

また、リレーショナルオプションを調べることもできますが、ゲーム自体の親密さを知らなくても、この基本的なサンプルは小さなゲームに適しています。

いずれにしても、この回答はあなたが望むものではなく、遠隔で閉じることもあります。しかし、おそらく私が最初に投稿したものよりも優れています。あなたのゲームで幸運。ゲームを作る楽しさのトンと今は間違いなくiosとアンドロイドのためにそれを行う時間です。

+0

申し訳ありませんが、私はチュートリアルを求めていませんでした。この種のゲームプレイをサポートするためにデータをどのように構造化できるかについて詳しく説明します。 DB表の例は、私がレイアウトの例に関して探していたものすべてでした。私は実際にキューや何かを持っているサーバーを実行するつもりはありませんでした - すべてのイベントは、各プレイヤーが移動に基づいて新しい状態を計算し、サーバー上のデータベースを更新するイベントに基づいていました。新しい状態にしてから移動します。 – Firefly

+0

まあ、大丈夫です。しかし、あいまいな答えでさえ、ゲームそのものについてもっと知る必要があるかもしれません。たとえば、さまざまなマップがありますか、マップがランダムに生成されているか、グリッド上で実行されているのか、それともPvPに似ていますか、プレイヤーは軍隊を持っているのでしょうか、私はそれが助けになるとは思っていません。 –

+0

ありがとうございます、あなたの更新された答えは、私が後にしたものに非常に近いです。ゲームにはマップやボードはありません。ポケモンのような1vs1のようなものです。通信はphp/json webservice経由で行われており、私はすでにユーザーと認証/トークンシステムを持っています。私の問題は、主にあなたの新しい投稿がたくさん役立つゲーム/戦いや行動を表現する方法でした。実際にはJSONのようなgamedataカラムをデータベースに格納することは考えていませんでしたが、必要なものごとに実際のカラムがありました。 JSONベースのフィールドを使用すると、おそらくより効率的で柔軟性があります:) – Firefly