我在这个论坛上发现了类似的问题,但没有一个能够完全回答我的问题。我正在尝试编写我的第一个基本程序,一个简单的二十一点游戏。
我的想法是为套装和价值观使用枚举;
private enum CardValue //enum for card values
{
Two = 2,
Three,Four,Five, Six, Seven,
Eight,Nine,Ten,
Jack = 10,
Queen = 10,
King = 10,
Ace
}
然后我制作一个这种类型的52元素数组来表示牌组并将其洗牌。问题在于,当我打印出shuflled值时,'Jack''Queen'和'King'都打印为'jack',我假设因为它们都具有相同的底层INT值。我希望能够以这种方式将值转换回INT以在游戏中累加总数。
答案 0 :(得分:4)
我假设因为它们都具有相同的基础INT值。
是的,完全正在发生的事情。
我希望能够以这种方式将值转换回INT以在游戏中累加总数。
不,你不应该这样做。将点值与卡表示分开。造成这种情况的主要原因是您遇到的实施问题。但从概念上讲,积分是您正在玩的游戏规则的功能,而不是卡本身的功能。因此,它们应该在概念上分开。
因此,如果你想对点值求和,只需要一个方法:
public int GetPoints(CardValue card) { }
然后如果您有一系列CardValue
s:
int total = cards.Sum(card => GetPoints(card));
请注意,您的方法可能不像仅仅使用CardValue
作为参数那么简单:想想Ace在某些游戏中具有低值和高值的双重角色。现在你再看到为什么直接将值分配给卡片不是一个好主意吗?
答案 1 :(得分:2)
是的,这将是预期的行为。你应该给每张卡一个唯一的枚举号码(杰克= 11,皇后= 11,王= 12),然后有一个翻译过程,以便在你需要时获得它们的数值。
static class CardExtensions
{
public static int GetValue(this CardValue card)
{
switch(card)
{
case Jack:
case Queen:
case King:
return 10;
default:
return (int)card;
}
}
}
CardValue.Jack.GetValue() // Returns 10
CardValue.King.GetValue() // Also returns 10