【问题标题】:How can I see if a value is contained in an Array or Class?如何查看值是否包含在数组或类中?
【发布时间】:2013-06-13 01:54:15
【问题描述】:

我正在制作二十一点游戏。我需要确定我的牌组是否包含特定值。

检查我的牌组最简单的方法是什么。最简单意味着更少的代码行和更少的混乱。注意我将给这些值相关的字符串。 (King、Jack、Queen 和 10 等于 10。)

这不涉及任何关于西装或颜色的内容。我将只显示卡片符号(K,Q)。

            enum deck {Ace=1|11, Two=2, Three=3, Four=4, Five=5, Six=6, Seven=7, Eight=8, Nine=9, Ten=10, Jack=10, Queen=10, King=10};

        int a = (int)deck.Ace;
        int b = (int)deck.Two;
        int c = (int)deck.Three;
        int d = (int)deck.Four;
        int e = (int)deck.Five;
        int f = (int)deck.Six;
        int g = (int)deck.Seven;
        int h = (int)deck.Eight;
        int i = (int)deck.Nine;
        int j = (int)deck.Ten;
        int k = (int)deck.Jack;
        int l = (int)deck.Queen;
        int m = (int)deck.King;

【问题讨论】:

  • 考虑使用两种 Enumerable 类型,一种用于花色,一种用于数字。
  • @Doc:你的意思是Enums,与Enumerable静态类或IEnumerable<T>接口完全无关。
  • @SLaks 啊,多年的 c# 和从不知道这一点。很高兴你指出了这一点,我需要重新思考我的生活。
  • 到目前为止你尝试过什么?您目前如何存储您的卡?你的Card 班级是什么样的?有很多关于这个主题的相关信息。那里有很多不同的数据结构,其中大多数都能够被搜索。由于您不太可能拥有非常大的数据集,因此您不必担心效率。试一试;走着瞧吧。如果遇到问题,请尝试一下并查找其他人的解决方案。如果您仍然无法正常工作,请在此处发布您的代码。
  • @Mr.Bottell 我不确定你在回复什么。你是说你的老师禁止你学习更多关于编程的知识吗?如果是这样,请抛弃他并找一位更好的老师,他知道自己学习新的编程概念是所有开发人员需要从一开始就开始开发的重要技能。如果这不是您要说的,请澄清您的意思。

标签: c# data-structures storage


【解决方案1】:

我会用一个枚举来表示等级,另一个来表示花色。

然后将它们封装在 Card 类中,如下所示:

public enum Suit
{
    Clubs,
    Diamonds,
    Hearts,
    Spades
}

public enum Rank
{
    Ace = 1,
    One,
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    Jack,
    Queen,
    King
}

public class Card: IEquatable<Card>
{
    public Rank Rank
    {
        get; 
        set;
    }

    public Suit Suit
    {
        get; 
        set;
    }

    public int Value
    {
        get
        {
            switch (Rank)
            {
                case Rank.Ten:
                case Rank.Jack:
                case Rank.Queen:
                case Rank.King:

                    return 10;

                default:

                    return (int) Rank;
            }
        }
    }
}

这里要注意的重要一点是Equals() 方法,它是IEquatable 接口的一部分。实现这一点使我们能够利用搜索方法,例如List.Contains()

使用上面的代码,你可以写出这样的东西:

List<Card> deck = new List<Card>();

deck.Add(new Card {Rank = Rank.Seven, Suit = Suit.Clubs} ); 
deck.Add(new Card {Rank = Rank.Five,  Suit = Suit.Diamonds} );

Card target1 = new Card {Rank = Rank.Five,  Suit = Suit.Diamonds };
Card target2 = new Card {Rank = Rank.Eight, Suit = Suit.Hearts };

Console.WriteLine(deck.Contains(target1)); // Prints true
Console.WriteLine(deck.Contains(target2)); // Prints false

Console.WriteLine(deck.IndexOf(target1)); // Prints 1

注意我们如何使用deck.Contains(target) 来查看卡片组是否包含特定卡片。

我们还可以使用IndexOf(target) 来查找卡片在牌组中的确切位置。

还要注意我们是如何实现 Card 的 Value 属性的。

我们不需要显式存储此值,因为您可以从卡片的等级中得出它。

看看我们如何返回十、杰克、皇后和国王的显式值。对于其他值,我们利用了这样一个事实,即等级的枚举值以 1 为 Ace,2 为 2 等开始。这意味着我们可以简单地将枚举转换为 int 以获得正确的值。

有了这个基础,创建DeckHand 类来模拟一副纸牌和一手纸牌以及洗牌之类的事情会更容易。 (如何做到这一点超出了这个特定问题和答案的范围。)

【讨论】:

  • 这就是为什么你不应该编辑我的问题,这里的第二个代码框太混乱了,包含无关紧要的套装。但是感谢您的尝试
  • @Mr.Bottell “不应该编辑我的问题”是什么意思?我没有编辑你的问题!无论如何,如果您觉得这太混乱并且不准备学习基本知识,那么您将没有希望编写二十一点游戏;我建议你去做一些不那么费力的事情。
  • 对不起不是你,那是为了服务
  • Value 可以只实现为Math.Min(10, Rank) 而不是开关。
  • @Mr.Bottell 我相当有信心,即使我没有从您的问题中编辑您的“我是新手”评论,它也不会改变马特在这里的回答。它实际上并没有比这更基本,同时仍然是您问题的适当解决方案。
【解决方案2】:

使用enums:

public enum Value
{
    V2,
    V3,
    //...
    V10,
    J,
    Q,
    K,
    A
}
public enum Suit
{
    Diamonds,
    Spades,
    Hearts,
    Clubs
}

public static bool ContainsCard(IEnumerable<Tuple<Suit,Value>> deck, Suit suit, Value value)
{
    return deck.Any(c => c.Item1 == suit && c.Item2 == value);
}

【讨论】:

    【解决方案3】:

    有很多可以接受的方法来解决这个问题。我会尝试的一种方法是制作两种类型的 enum 并为每张卡分配它们。例如,

    public enum CardNumber { Ace, Two, Three, ... Ten, Jack, Queen, King };
    public enum CardSuit { Diamond, Heart, Club, Spade};
    

    一旦创建了这两种类型,您就可以为您制作的每张卡片声明上述每种类型中的一种。此时,卡片可以轻松存储在您喜欢的系统中 - 例如数组或列表。

    【讨论】:

    • 这不是显示如何搜索数据结构,而是显示如何表示Card。那是different question
    • 数字文字不允许作为枚举成员标识符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2020-05-07
    • 2017-10-17
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多