-1

ブラックジャックゲームを作っています。デッキに特定の値が含まれているかどうかを判断する必要があります。

自分のデッキを確認する最も簡単な方法は何でしょうか。最も簡単なのは、コード行が少なく、混乱が少ないことを意味します。これらの値に関連する文字列を与えることに注意してください。(King、Jack、Queen、Ten は 10 になります。)

これは、スーツや色に関するものではありません。カードのシンボル (K、Q) のみを表示します。

            enum deck {Ace=1|11, Two=2, Three=3, Four=4, Five=5, Six=6, Seven=7, Eight=8, Nine=9, Ten=10, Jack=10, Queen=10, King=10};

        int a = (int)deck.Ace;
        int b = (int)deck.Two;
        int c = (int)deck.Three;
        int d = (int)deck.Four;
        int e = (int)deck.Five;
        int f = (int)deck.Six;
        int g = (int)deck.Seven;
        int h = (int)deck.Eight;
        int i = (int)deck.Nine;
        int j = (int)deck.Ten;
        int k = (int)deck.Jack;
        int l = (int)deck.Queen;
        int m = (int)deck.King;
4

3 に答える 3

2

1 つの列挙型を使用してランクを表し、別の列挙型を使用してスーツを表します。

Card次に、それらを次のようにクラスにカプセル化します。

public enum Suit
{
    Clubs,
    Diamonds,
    Hearts,
    Spades
}

public enum Rank
{
    Ace = 1,
    One,
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    Jack,
    Queen,
    King
}

public class Card: IEquatable<Card>
{
    public Rank Rank
    {
        get; 
        set;
    }

    public Suit Suit
    {
        get; 
        set;
    }

    public int Value
    {
        get
        {
            switch (Rank)
            {
                case Rank.Ten:
                case Rank.Jack:
                case Rank.Queen:
                case Rank.King:

                    return 10;

                default:

                    return (int) Rank;
            }
        }
    }
}

ここで注意すべき重要なことは、インターフェースEquals()の一部であるメソッドです。IEquatableこれを実装すると、 などの検索方法を活用できますList.Contains()

上記のコードを使用すると、次のように記述できます。

List<Card> deck = new List<Card>();

deck.Add(new Card {Rank = Rank.Seven, Suit = Suit.Clubs} ); 
deck.Add(new Card {Rank = Rank.Five,  Suit = Suit.Diamonds} );

Card target1 = new Card {Rank = Rank.Five,  Suit = Suit.Diamonds };
Card target2 = new Card {Rank = Rank.Eight, Suit = Suit.Hearts };

Console.WriteLine(deck.Contains(target1)); // Prints true
Console.WriteLine(deck.Contains(target2)); // Prints false

Console.WriteLine(deck.IndexOf(target1)); // Prints 1

deck.Contains(target)デッキに特定のカードが含まれているかどうかを確認する方法に注意してください。

IndexOf(target)カードがデッキのどこにあるかを正確に見つけるためにも使用できます。

Valueまた、カードのプロパティをどのように実装したかにも注目してください。

カードのランクから導出できるため、この値を明示的に保存する必要はありません。

Ten、jack、Queen、King の明示的な値を返す方法を確認してください。他の値については、ランクの列挙値がエースの場合は 1、ツーの場合は 2 などで始まるという事実を利用します。これは、enum を int に単純にキャストして正しい値を取得できることを意味します。

この基盤を使用すると、カードのデッキとカードのハンドをシミュレートするクラスを作成しDeckたりHand、デッキをシャッフルしたりするのが簡単になります。(それを行う方法は、この特定の質問と回答の範囲を超えています。)

于 2013-06-12T16:44:18.350 に答える
0

使用enums:

public enum Value
{
    V2,
    V3,
    //...
    V10,
    J,
    Q,
    K,
    A
}
public enum Suit
{
    Diamonds,
    Spades,
    Hearts,
    Clubs
}

public static bool ContainsCard(IEnumerable<Tuple<Suit,Value>> deck, Suit suit, Value value)
{
    return deck.Any(c => c.Item1 == suit && c.Item2 == value);
}
于 2013-06-12T16:43:18.440 に答える
0

この問題に対処するための受け入れ可能な方法はたくさんあります。私が試みる 1 つの方法は、2 種類の列挙型を作成し、それらを各カードに割り当てることです。例えば、

public enum CardNumber { Ace, Two, Three, ... Ten, Jack, Queen, King };
public enum CardSuit { Diamond, Heart, Club, Spade};

これら2つのタイプが作成されたら、作成したカードごとに上記のいずれかを宣言できます。この時点で、カードはお好みのシステム (配列やリストなど) に簡単に格納できます。

于 2013-06-12T16:43:40.957 に答える