1

私はデータベースに手のデッキを保存する必要があるアプリケーションに取り組んでいます。これをデータベースで表現する最良の方法が何であるかはわかりません。

デッキは、アプリケーションによってそれぞれ 13 枚のカードを保持する 4 つのハンドに事前に配られます。その後、手とスーツの配布などの追加データを保存する必要があります...

手札ごとに別の行を作成し、それをデッキに関連付けるのが最善ですか? それとも一列に並べたほうがいいのでしょうか?

また、それらをテキストまたは数値として保持する必要があるかどうかもわかりません。次に例を示します。

Sorted by suit and separated by dot
AK.32.6543.AKQ98

または

(52 = Largest rank or largest suit or 02 = 2 of smallest suit)
405251282717161514012322200908

何か案は?

PS: カードを保管するのには理由があります。ハンドの分布、高いカード ポイントなどを分析する必要があります...

4

3 に答える 3

4

それは、実行したい分析の種類によって異なります。私だったら、おそらくデフォルトで次のようなものになるでしょう(非主要な制約を無視します)

CREATE TABLE card (
  card_id NUMBER PRIMARY KEY,
  suit    VARCHAR2(10) NOT NULL,
  value   VARCHAR2(1)  NOT NULL
);

CREATE TABLE hand (
  hand_id   NUMBER PRIMARY KEY,
  player_id NUMBER NOT NULL
);

CREATE TABLE hand_element (
  hand_element_id NUMBER PRIMARY KEY,
  hand_id         NUMBER NOT NULL,
  card_id         NUMBER NOT NULL
);

それぞれHANDに 13 行ありHAND_ELEMENTます。スーツの分布に関する情報をわざわざ保存する必要はありません。手の分布を計算するだけです。つまり、

SELECT suit, count(*)
  FROM hand JOIN hand_element USING (hand_id)
            JOIN card         USING (card_id)
 WHERE hand_id = :some_hand_id
于 2011-04-14T16:31:43.943 に答える
4

最も自然なことは、カード用のテーブルを作成し、デッキ内のカードごとに 1 つのレコードを作成し、次にハンド用のレコードを作成して、ハンド内のカードごとに 1 つのレコードを作成することだと思います。ハンド全体に関するデータがある場合、プレイヤーの名前は? 彼はテーブルのどこに座っていますか?彼は何枚のチップを持っていますか? 何でも - ハンドのカードとは対照的に、ハンド用に別のテーブルが必要になります。スーツ用のルックアップ テーブルも作成します。

(ここで合成キーと自然キーの使用について議論することもできますが、それは別の問題です。)

card (cardid, suitid, rank)
suit (suitid, suitname)
hand (handid, playername, whatever)
handcard (handcardid, handid, cardid)

私の最初の衝動は、「ランク」を 1 から 13 までの数字にし、出力時に 1 を「エース」に、11 から 13 を「ジャック」、「クイーン」、および「キング」に変換することです。それらをテキストとして保存することはできますが、ランクを比較する必要がある場合、ランクを比較することは困難です。つまり、13>10 がデータベースにとって簡単かどうかを判断します。King>10、それほどでもない。

ピリオドや固定長のIDなどで区切られているかどうかにかかわらず、複数のカードの識別を単一のフィールドに詰め込もうとは絶対にしません。これを行うには、データベースが必要なデータを取得するだけでなく、必要なデータを取得するためにこのフィールドを分解するコードがプログラムに必要になります。これがデータベースの目的です。

あなたがこれらのカード ハンドで何をしたいのかはわかりませんが、私が説明しているような構造でやりたいと思うことのほとんどはかなり簡単ですが、カードのリストを 1 つのカードに詰め込むとかなり難しいです。分野。「スペードのキングを持っているのは誰?」簡単:

select playername
from hand
join handcard using (handid)
join card using (cardid)
join suit using (suitid)
where suit.name='Spades' and card.rank=13

または、「各プレイヤーは何枚の顔カードを持っていますか?」

select playername, count(*)
from hand
join handcard using (handid)
join card using (cardid)
where card.rank between 11 and 13

もちろん、「プレイヤー #3 が持っているカードは何ですか?」も簡単です:

select rank, suitname
from handcard
join card using (cardid)
join suit using (suitid)
where handid=3

パックされた形式でこれらのクエリを実行するには、トリッキーな文字列抽出呼び出しが必要になります。そして、文字列操作は常に面倒です。いつものように、テキストで 2 を検索している場合、'12' の一部である 2 を除外するにはどうすればよいですか? 等

于 2011-04-14T16:57:49.650 に答える
0

3 カード ポーカーの同様のプロジェクトにも取り組んでいます。私は次のようにSQLを設定しました:

CREATE TABLE cards 
(

    id int AUTO_INCREMENT,
    suite varchar(30) NOT NULL,
    rank int NOT NULL,
    dealt BOOLEAN DEFAULT false,
    PRIMARY KEY (id)

);

次に、コマンドを実行して、次の方法でデータベースにデータを入力します。

INSERT INTO cards (suite,rank) VALUES ('spades',1);

このようにして、データベースをループし、カードが配られているときに配られたものを「真」に変更できます。ランキングの比較も簡単にできます。

于 2016-05-14T14:22:58.453 に答える