-1

我正在制作二十一点游戏。我需要确定我的牌组是否包含特定值。

检查我的牌组最简单的方法是什么。最简单意味着更少的代码行和更少的混乱。注意我将给这些值相关的字符串。(King、Jack、Queen 和 10 等于 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

我会使用一个枚举来代表等级,另一个来代表西装。

然后将它们封装在一个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)来准确找到卡片在牌组中的位置。

还要注意我们是如何实现 Card 的Value属性的。

我们不需要显式存储此值,因为您可以从卡的等级中得出它。

看看我们如何返回十、杰克、皇后和国王的显式值。对于其他值,我们利用了这样一个事实,即等级的枚举值以 1 开始表示 Ace,2 表示 2 以此类推。这意味着我们可以简单地将枚举转换为 int 以获得正确的值。

有了这个基础,就可以更容易地创建一个DeckHand来模拟一副纸牌和一手牌,并且还可以做诸如洗牌之类的事情。(如何做到这一点超出了这个特定问题和答案的范围。)

于 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

有很多可以接受的方法来解决这个问题。我会尝试的一种方法是制作两种类型的枚举并为每张卡分配它们。例如,

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

一旦创建了这两种类型,您就可以为您制作的每张卡声明上述每种类型中的一种。此时,卡片可以轻松存储在您喜欢的系统中 - 例如数组或列表。

于 2013-06-12T16:43:40.957 回答