我正在创建一副牌并在枚举中使用我的套装和值,但我的语法在试图填充我的列表套牌时没有。另外,Ace可以具有1或11的值,是否有某种方法可以将其合并到我的Enum中,或者我需要在执行诸如为二十一点求手之类的事情时编写代码?
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
}
答案 0 :(得分:6)
您的问题是这一行:
foreach(Enum v in Values)
您不能以这种方式枚举enum
。 Values
是enum
类型声明的名称,而不是一组值。
你可以这样做:
foreach (var v in Enum.GetValues(typeof(Values)))
答案 1 :(得分: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));
}
}
我认为你的价值观不会正常运作。使用Ten
到King
之间的值之一初始化某些内容后,您将无法确定它原来是什么。
我认为你需要更像这样的东西(也将你的复数枚举名重命名为单数,以匹配正常的命名约定):
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()
,例如卡的ToString()
将成为:
public override string ToString()
{
return _rank + " of " + _suit + " with value " + _rank.Value();
}