0

我正在创建一副纸牌并将我的套装和值放在枚举中,但我的语法在尝试填充我的列表牌组时是关闭的。另外顺便说一句,Ace 的值可以是 1 或 11,是否有某种方法可以将其合并到我的枚举中,或者我是否需要在执行诸如总结二十一点之类的事情时将其编码?

public class Deck
{
    private List<Card> cards;
    private Random random = new Random();
    public Deck()
    {
        cards = new List<Card>();
        for (int s = 0; s < 4; s++)
            //for (int v = 0; v < 14; v++)
            foreach(Enum v in Values)
                cards.Add(new Card((Suits)s, (Values)v));
    }

这是我的适合和价值的枚举:

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

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

2 回答 2

6

你的问题是这一行:

foreach(Enum v in Values)

你不能enum以这种方式枚举 's。Values是您的enum 类型声明的名称..不是一组值。

你可以做这样的事情:

foreach (var v in Enum.GetValues(typeof(Values)))
于 2013-06-24T12:30:18.193 回答
1

您需要使用Enum.GetValues()来获取枚举的所有值的数组。

然后你应该能够做这样的事情(不确定这是否会编译,但你应该明白):

foreach (var suit in Enum.GetValues(typeof(Suits)))
{
    foreach (var value in Enum.GetValues(typeof(Values)))
    {
        cards.Add(new Card((Suits)suit, (Values)value));
    } 
}

我不认为你的价值观枚举会正常工作。一旦你用 to 之间的值之一初始化了一些东西TenKing你将无法分辨它最初是什么。

我认为你需要更像这样的东西(也将你的复数枚举名称重命名为单数,以匹配正常的命名约定):

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

public enum Rank
{
    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
}

class Card
{
    readonly Suit _suit;
    readonly Rank _rank;

    public Card(Suit suit, Rank rank)
    {
        _suit = suit;
        _rank = rank;
    }

    public Rank Rank
    {
        get
        {
            return _rank;
        }
    }

    public Suit Suit
    {
        get
        {
            return _suit;
        }
    }

    public int Value
    {
        get
        {
            if (Rank >= Rank.Ten)
            {
                return 10;
            }
            else
            {
                return (int) Rank;
            }
        }
    }

    public override string ToString()
    {
        return _rank + " of " + _suit + " with value " + Value;
    }
}

您还可以使用 Linq 来初始化您的Card列表,如下所示:

List<Card> cards = 
(
    from suit in Enum.GetValues(typeof(Suit)).OfType<Suit>()
    from rank in Enum.GetValues(typeof(Rank)).OfType<Rank>()
    select new Card(suit, rank)
).ToList();

如果您想保持Value计算更紧密地关联Rank而不是在 中进行Card,您可以为 编写一个扩展方法Rank

static class RankExt
{
    public static int Value(this Rank rank)
    {
        if (rank >= Rank.Ten)
        {
            return 10;
        }
        else
        {
            return (int)rank;
        }
    }
}

然后,无论您有Rank什么可以使用Rank.Value()的,例如 Card'sToString()都会变成:

public override string ToString()
{
    return _rank + " of " + _suit + " with value " + _rank.Value();
}
于 2013-06-24T12:31:35.940 回答