如何查看数组或类中是否包含值?

时间:2013-06-12 16:37:28

标签: c# data-structures storage

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

检查我的套牌最简单的方法是什么?最简单的意思是减少代码行数,减少混乱。注意我将给出这些值相关的字符串。 (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;

3 个答案:

答案 0 :(得分: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)来确定卡片在牌组中的确切位置。

另请注意我们如何实施了卡的Value属性。

我们不需要明确存储此值,因为您可以从卡的等级中派生出来。

了解我们如何为Ten,jack,Queen和King返回显式值。对于其他值,我们利用了这样一个事实,即排名的枚举值从1开始为1,2开始为2,依此类推。这意味着我们可以简单地将枚举转换为int以获得正确的值。

有了这个基础,就可以更容易地创建一个Deck和一个Hand类来模拟一副牌和一副牌,还可以做一些像洗牌一样的事情。 (如何做到这一点超出了这个特定问题和答案的范围。)

答案 1 :(得分: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);
}

答案 2 :(得分:0)

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

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

创建这两种类型后,您可以为您制作的每张卡声明上述每种类型之一。此时,这些卡可以很容易地存储在您首选的系统中 - 例如数组或列表。