関連するブラックジャックの質問を見ると、文字列/アイテムの配列を作成するか、整数を作成するかのどちらをカードに使用するのが良いかについて混乱があります。
私のブラックジャック ゲームでは、エースは 11 のみで 10、J、Q、K はすべて値 10 で、スートは関係ありません。文字列または整数でカードをコーディングしやすくするにはどうすればよいですか?
Visual Studio C# 2010、Windows フォーム アプリケーション
関連するブラックジャックの質問を見ると、文字列/アイテムの配列を作成するか、整数を作成するかのどちらをカードに使用するのが良いかについて混乱があります。
私のブラックジャック ゲームでは、エースは 11 のみで 10、J、Q、K はすべて値 10 で、スートは関係ありません。文字列または整数でカードをコーディングしやすくするにはどうすればよいですか?
Visual Studio C# 2010、Windows フォーム アプリケーション
カードはオブジェクトなので、独自のクラスにします。
スーツの列挙型 (ハート、ダイアモンド、クラブ、スペード) とランクの列挙型 (エース、ジャック、10 など、比較しやすいように並べたもの) を使用する必要があります。スーツから色を派生させることができるので、冗長であるため、色をコンストラクターへのパラメーターにすることはお勧めしません。ゲームで複数のデッキを使用している場合のように、カードの複製を計画している場合を除き、コンストラクターで実際に必要なのはこれら 2 つのフィールドだけです。これらのカードを使用する場合は、多くの並べ替え操作が組み込まれているため、リストまたは同様のタイプを使用することを強くお勧めします。デッキをシャッフルする必要がある場合は、クヌース シャッフルを使用してください。Google で簡単に見つけることができ、実装も簡単で、高速かつ効率的に機能します。
このアプローチは、私のコンピュータ サイエンスの教授からのものであり、私もそれを高く評価する傾向があります。コードが実生活をモデル化すればするほど、理解と拡張が容易になります。int や string の定数を使うこともできますが、それらは余分な作業であり、実行する必要がなく、エレガントでもありません。
public class Card
{
public Suit Suit { get; private set; }
public Rank Rank { get; private set; }
public Card(Suit suit, Rank rank)
{
this.suit = suit;
this.rank = rank;
}
}
文字列が実際のテキスト以外の最良の内部表現になることはほとんどありません。弦は人のためのものです。コンピュータは数字を使います。特にカードの場合、カードはしばしばランクで比較し、値で追加する必要があるため、簡単です。プログラムに 12 > 11 であることを伝えたり、合計に 10 を加算したりするのは、"K" > "Q" であることを伝えたり、"J" を合計に加算したりするよりもはるかに少ないコードで済みます。内部で文字列を使用することは、データ表現について学ぶのが面倒な新人プログラマーにとって一般的です。
もちろん、C++ のようなオブジェクト指向言語ではオブジェクトを使用できますが、カードのランクとスーツを保持するオブジェクトのメンバー変数は整数である必要があるため、ルックアップ テーブルにインデックスを付けたり、範囲を比較したりできます。
私はここでカード表現に関するエッセイを書きました。
ブラックジャックの場合、汎用のカード表現が必要ない場合は、1 から 10 の整数のみを使用するのが理想的です。エースには 11 ではなく 1 を使用してください。これにより、全体の計算が高速化されます。1 つのエースを 1 から 11 に昇格させるだけで済みますが、複数のエースを 11 から 1 に降格させる必要があります。
たとえば、ハンドを表すこれらの整数の配列がある場合、ハンドの合計を追加すると次のようになります (もちろん、具体化されています)。
int total = 0, acefound = 0, soft = 0;
for (int i = 0; i < cardsinhand; ++i) {
total += hand[i];
if (1 == hand[i]) acefound = 1;
}
if (acefound && total < 12) {
soft = 1;
total += 10;
}
シンプルで、驚くほど高速です。実際のカードを表している場合は、ランク 11、12、13 のフェイス カードがif (r > 10) r = 10;
あるため、そこに次のようなものを追加します (エースを 1 にするもう 1 つの理由)。このように数分で数十億のハンドをシミュレートできます。
Blackjack コンソール アプリケーションサンプル プロジェクト (C#) GitHub:
https://github.com/koistya/ブラックジャック
public class Card
{
public Card(Rank rank, Suite suite)
{
this.Rank = rank;
this.Suite = suite;
this.IsFaceUp = true;
}
public Rank Rank { get; private set; }
public Suite Suite { get; private set; }
public bool IsFaceUp { get; private set; }
public void Flip()
{
this.IsFaceUp = !this.IsFaceUp;
}
}
public enum Rank : byte
{
Ace = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
Eight = 8,
Nine = 9,
Ten = 10,
Jack = 11,
Queen = 12,
King = 13,
}
public enum Suite : byte
{
Club = 1,
Diamond = 2,
Heart = 3,
Spades = 4
}
enum
13の可能な値については、より良いアイデアになるでしょう