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,以将游戏中的总数相加。

C#数组中存在重复的ENUM值

我之所以假设,是因为它们都有相同的潜在INT值。

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

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

不,你不应该那样做。将点值从卡表示中分离出来。造成这种情况的主要原因是您遇到的实现问题。但从概念上讲,积分是你所玩游戏的规则的函数,而不是本身的函数。因此,它们应该在概念上分离。

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

public int GetPoints(CardValue card) { }

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

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