C#在数组中复制ENUM值

时间:2013-08-07 03:13:02

标签: c#

我在这个论坛上发现了类似的问题,但没有一个能够完全回答我的问题。我正在尝试编写我的第一个基本程序,一个简单的二十一点游戏。

我的想法是为套装和价值观使用枚举;

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以在游戏中累加总数。

2 个答案:

答案 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