C#数组中存在重复的ENUM值
本文关键字:ENUM 数组 存在 | 更新日期: 2023-09-27 18:26:43
我在这个论坛上发现了类似的问题,但没有一个能完全回答我的问题。我正在尝试编写我的第一个基本程序,一个简单的21点游戏。
我的想法是使用枚举来表示套装和价值观;
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元素的数组来表示牌组,并对其进行洗牌。问题是,当我打印出被洗牌的值"Jack"、"Queen"answers"King"时,我假设它们都打印为"Jack",因为它们都有相同的底层INT值。我希望能够以这种方式将值投射回INT,以将游戏中的总数相加。
我之所以假设,是因为它们都有相同的潜在INT值。
是的,这正是正在发生的事情。
我希望能够以这种方式将值投射回INT,以将游戏中的总数相加。
不,你不应该那样做。将点值从卡表示中分离出来。造成这种情况的主要原因是您遇到的实现问题。但从概念上讲,积分是你所玩游戏的规则的函数,而不是牌本身的函数。因此,它们应该在概念上分离。
因此,如果你想对点值求和,只需要一个方法:
public int GetPoints(CardValue card) { }
然后如果你有一个CardValue
S:序列
int total = cards.Sum(card => GetPoints(card));
请注意,您的方法可能不像仅仅将CardValue
作为参数那么简单:想象一下Ace在某些游戏中具有低值和高值的双重角色。现在你又明白为什么直接将值分配给卡片不是一个好主意了吗?
是的,这将是预期的行为。你应该给每张牌一个唯一的枚举数(Jack=11,Queen=11,King=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