0

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

我的想法是对西装和价值观使用枚举;

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' 和 'King' 全部打印为 'jack' 的改组值时,我假设它们都具有相同的基础 INT 值。我希望能够以这种方式将值转换回 INT 以将游戏中的总数相加。

4

2 回答 2

4

我假设是因为它们都具有相同的基础 INT 值。

是的,这正是正在发生的事情。

我希望能够以这种方式将值转换回 INT 以将游戏中的总数相加。

不,你不应该那样做。将点值与卡片表示分开。主要原因是您遇到的实施问题。但从概念上讲,点数是你正在玩的游戏规则的函数,而不是本身。因此,它们应该在概念上分开。

因此,如果你想对点值求和,只需一个方法:

public int GetPoints(CardValue card) { }

然后如果你有一个CardValues 序列:

int total = cards.Sum(card => GetPoints(card));

请注意,您的方法可能不像仅仅将 aCardValue作为参数那么简单:想想 Ace 在某些游戏中具有低值和高值的双重角色。现在您是否再次看到为什么将值直接分配给卡片不是一个好主意?

于 2013-08-07T03:18:23.420 回答
2

是的,这将是预期的行为。您应该给每张卡片一个唯一的枚举编号(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
于 2013-08-07T03:18:45.800 回答