sql >> データベース >  >> RDS >> Database

ドミノの秘密、またはドミノゲームデータモデル

    ドミノのようなボードゲームは今でも非常に人気があります。データモデリングの観点からドミノを見てみましょう。

    ドミノのゲームは何百年も前から存在しており、世界中でプレイされています。ご想像のとおり、これは遊びのバリエーションがたくさんあることを意味します!この記事では、最も一般的なバリアントである描画とブロックをサポートできるデータモデルを検討します。これら2つのバリアントの基本はほとんど同じです。ルールにはわずかな違いがあります。ドミノは2人以上のプレーヤーでプレイできるため、データモデルは複数のプレーヤーをサポートします。

    ドミノゲームプレイの基本から始めて、データモデルに移りましょう。

    ドミノについて知っておくべきこと

    • ドミノセットには、「ボーン」または「タイル」と呼ばれる28個のプレイピースが含まれています。それらは長方形で、中央に各タイルを2つの正方形の端(または面)に分割する線があります。
    • 両端には0から6の範囲のスポットがいくつかあります。これらのスポットは「ピップ」と呼ばれます。
    • 両端で同じ値のタイルは「ダブル」と呼ばれます。例:ダブルシックスには、両端に6つのピップがあります。
    • プレイ面にあるドミノの集まりは、プレイラインと呼ばれます。プレーラインの終わりはブランチコーナーと呼ばれます。 ブランチコーナー プレイヤーが新しいタイルをプレイできる場所です。

    ゲームの開始

    • すべてのタイルは表を下にしてテーブルに置かれます。
    • 2〜3人のプレイヤーがいる場合、各プレイヤーは7枚の牌を引きます。 4〜5人のプレイヤーがいる場合、各プレイヤーは5枚の牌を引きます。残りのタイルは「ボーンヤード」と呼ばれる山に残されます。
    • ダブルが最も高いプレイヤーが最初の動きをします。通常、再生は時計回りに移動します。
    • ドミノをプレイするには、プレーヤーはすでにテーブルに置かれているタイルの隣にタイルを置きます。タイルの端は一致している必要があります。つまり、2ピップの端は、別の2ピップの端の隣にのみ配置できます。 (注:一部のゲームバリアントには、マッチングに関して異なるルールがあります。)

    ゲームルール

    • 最初のプレーヤーは、テーブルの一番高いダブルフェイスを上に置きます。
    • 次のプレーヤーは、前に配置されたドミノと一致するドミノをプレイする必要があります。
    • フォーメーションのどちらの端にも一致しないプレーヤーは、「ノック」または「パス」する必要があります。ブロックゲームでは、これは単にプレイが次のプレイヤーに渡されることを意味します。ドローゲームでは、プレイヤーはプレイ可能なタイルが見つかるまで、ボーンヤードからタイルをドローする必要があります。ボーンヤードが空の場合、プレイは単に次の人に渡されます。ドローゲームのいくつかのバリエーションは、プレイヤーがドローしなければならないタイルの数を制限します。つまり、最大3タイルです。プレイヤーが指定された数のタイルを引いてもマッチが得られない場合、プレイは次の人に移動します。
    • プレイラインには、いつでも2つ以上のブランチ(プレイ可能なエンド)があります。プレイヤーは、自分のタイルの1つと同じ数のピップを持つ任意のブランチでプレイできます。ダブルスは他のすべてのタイルに対して直角に配置されます。 (注:一部のバリアントには、プレイラインに関して異なるルールがあります。)

    ドミノゲームに勝つ

    • ドローゲームでは、すべてのタイルをプレイした最初のプレーヤーが勝ちます。プレイラインの両端がブロックされ、ドミノがボーンヤードに残らなくなるまで、プレイは続行される場合と続行されない場合があります。
    • ブロックゲームでは、端がブロックされ、プレイ可能なタイルが残っていない場合、タイルが最も少ないプレーヤーが勝ちます。

    スコアリング

    ドローゲームでは、敗者の残りのドミノのピップの合計が勝者のスコアになります。ブロックゲームでは、残りのピップの合計が最も少ない人が勝ちます。このプレイヤーは、対戦相手の合計から自分の合計を差し引きます。違いは勝者のスコアです。注:一部のゲームでは、プレーヤーは勝つために最小スコアに到達する必要があります。

    ドミノデータモデル

    ドミノデータモデルは、次の2つのサブジェクト領域で構成されています。

    • “Entities: players, dominoes and games” および
    • “Game progress and tracking”

    各主題分野について、記載されている順序で説明します。




    サブジェクトエリア1:プレーヤー、ドミノ、ゲーム

    このサブジェクトエリアには、ドミノゲームの主要なエンティティと呼ぶことができるものが含まれています。プレーヤー、ドミノタイル、およびゲームです。

    「プレーヤー」テーブルには、すべての個々のプレーヤーのプロファイルの詳細が保持されます。この表の列は次のとおりです。

    • id –各プレーヤーの一意のID。
    • player_name –プレーヤーの名前と名前。

    この表の次の列には、各プレーヤーのゲーム統計が格納されています。

    • num_block_game_played –プレーヤーがプレイしたブロックゲームの数。
    • num_draw_game_played –プレーヤーがプレイしたドローゲームの数。
    • num_block_game_win –プレーヤーが獲得したブロックゲームの数。
    • num_draw_game_win –プレーヤーが獲得したドローゲームの数。
    • highest_block_score –ブロックゲームでのプレーヤーの最高スコア。
    • highest_draw_score –ドローゲームでのプレーヤーの最高得点。

    bone 」テーブルには、ドミノタイル自体に関する情報が含まれています。この表の列は次のとおりです。

    • id –タイルごとに一意のキー。このキーは他のテーブルから参照されます。
    • first_face_value –最初の面(端)のドットの数。
    • second_face_value – 2番目の面(端)のドットの数。

    game 」テーブルには、ゲームに関する情報が格納されます。この表の列は次のとおりです。

    • id –このテーブルの主キー。各ゲームを一意に識別します。
    • game_variant –再生されたバリアント、つまり「ブロック」または「描画」。
    • score_to_win –ゲームに勝つために必要な最小スコア。
    • num_round_complete –そのゲームでプレイされたラウンドの数。通常、各ゲームには複数のラウンドが含まれ、誰かが勝利スコアを達成するまで続きます。

    player_in_game 」の表は、どのプレーヤーがゲームに参加しているかを示しています。 player_idの他に 、このテーブルは、現在のスコアをplayer_curr_scoreに保持します 桁。プレイヤーが勝つと、is_winnerに「Y」が配置されます 桁。複数のプレーヤーがゲームに勝つことができるため、「game " テーブル。

    サブジェクトエリア2:ゲームの進行と追跡

    ドミノプレイヤーなら誰でも知っているように、ゲームの実際のアクションは、その手、ラウンド、および動きで構成されています。これは、ゲームを作成または中断する小さな詳細です。このサブジェクトエリアはそれらの詳細を処理します。

    ゲームは通常、複数のラウンドを必要とします。ラウンドごとに、いくつかのタイルが各プレーヤーに配布されます。このタイルの分布を「手」と呼びましょう。ラウンドが始まるたびに、各プレイヤーは自分がプレイできるタイルの手札を持っています。 (注:一部のドローゲームでは、各手札のタイルの数が7を超える場合があります。)

    round 」テーブルには、各ラウンドの詳細が格納されます。これには、現在のプレイ状態のスナップショットが含まれます。ブランチコーナーの現在のタイル値。この表の列は次のとおりです。

    • id –各ラウンドに割り当てられた一意の番号。
    • game_id –「game 」の表で、ラウンドが属するゲームを示します。
    • left_branch_valueの値を保持します ブランチコーナー。値(ピップ数)が一致するタイルは、次の手で再生できます。
    • right_branch_value rightの値を保持します ブランチコーナー。値(ピップ数)が一致するタイルは、次の手で再生できます。
    • curr_num_tiles_boneyard –任意の時点でのボーンヤード内のタイルの数。この列の値は、プレイヤーがタイルを引くたびに1つずつ減ります。このコラムは、ドローゲーム中に役立ちます。

    hand 」テーブルは、ラウンド中にプレイヤーの手にあるすべてのタイルを記録します。この表の列は次のとおりです。

    • id –このテーブルの主キー。
    • round_id –「round 」の表で、関連するラウンドを示します。
    • player_id –「player 」の表で、関連するプレーヤーを示します。
    • bone_id –「bone 」の表は、プレーヤーが手札に持っている/持っているタイルを示しています。
    • is_played –タイルがプレイされたかどうか。最初は、この列はnullになります。タイルがプレイされている場合にのみ、「Y」が入力されます。同じ牌を1ラウンドで2回プレイすることはできません。
    • is_fetched –この列の「Y」は、タイルが移動中に描画されたことを示します。ドローゲームに便利です。

    move 」テーブルは、ラウンドでプレイされた各タイルの移動シーケンスを記録します。この表の列は次のとおりです。

    • id –ラウンド内の各動きを一意に識別します。
    • round_id –「round 」の表で、関連するラウンドを示します。
    • move_type –移動のタイプ、つまりパス(P)、ドロー(D)、またはレイダウン(L)。
    • hand_id –「hand 」の表で、どのプレーヤーが移動しているかを示します。
    • branch_played_at –移動が行われるブランチ(左または右)を示します。この列は、「レイダウン」移動の場合にのみ入力されます。
    • move_sequence –この数字の列は1から始まり、移動するたびに1ずつ増加します。

    player_round_score 」テーブルには、各ラウンドの個々のプレーヤーのスコアが格納されます。このテーブルには、game_idで構成される複合主キーがあります 、player_id 、およびround_id 列。 game_id およびplayer_id 列は「player_in_game " テーブル。

    Dominoデータモデルに何を追加しますか?

    ベーシックトレイン、メキシカントレイン、チキンフット、ベンドミノ、キプロス、マルタ十字、マタドール、スピナー–これらはドミノの多くのバリエーションのほんの一部です!これらのゲームに対応するためにこのモデルを拡張するには何が必要だと思いますか?基本モデルに何を変更または追加しますか?下のコメントセクションで教えてください!


    1. サブクエリでビット単位のORを集約

    2. 3つのテーブルの内部結合

    3. jdbcTimestampまたはDateを使用する場合のOracleとの無視できない実行プランの違い

    4. MySQLまたはMariaDBGaleraクラスターでレプリケーションパフォーマンスを向上させる方法