【问题标题】:Cannot get the shuffle method to collect the list无法获取 shuffle 方法来收集列表
【发布时间】:2014-08-29 17:02:29
【问题描述】:

我遇到了这个愚蠢的问题,我不知道如何解决,我正在创建一个二十一点游戏,我有一个带有 Deck() 和 Shuffle() 方法的卡片类,以及一个分发卡片的经销商类.

shuffle 方法是我在这个网站上获得的扩展方法,很有趣,但我无法让它从 Deck() 方法接收卡片列表...

我最初使用字典,但在改组字典时遇到了麻烦,并在此站点上寻求帮助 Here 他们建议使用列表,现在我在这里。

这里是 Card 和 Dealer 类

卡片.cs

public static class Card
{
    private static List<string> deckOfCards = new List<string>();


    private static string[] Suite = new string[4] {"Clubs", "Hearts", "Spades", "Diamonds" };
    private static string[] FaceValue = new string[13] {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" };


    public static void Deck()
    {
        for (int s = 0; s < 4; s++ )
        {
            string sut = Suite[s];

            for (int fV = 0; fV < 13; fV++)
            {
                string value = FaceValue[fV];

                deckOfCards.Add(sut + value);
            }
        }
        // End of For loop.
        Shuffle(deckOfCards);
    }

    public static void Shuffle<T>(this IList<T> list)
    {
        Random rng = new Random();
        int n = list.Count;
        while (n > 1)
        {
            n--;
            int k = rng.Next(n + 1);
            T value = list[k];
            list[k] = list[n];
            list[n] = value;
        }
    }
}

Dealer.cs

class Dealer
{
    private List<string> randomisedCards = new List<string>();

    public Dealer()
    {
        randomisedCards.Shuffle();
    }


    public string dealCard()
    {
        string randCard = randomisedCards[0];
        randomisedCards.RemoveAt(0);

        return randCard;
    }
}

强烈建议批评,因为这是您学习的方式,但请记住,我仍然是初学者,完全没有经验。

谢谢

【问题讨论】:

  • 我没有看到 DealerCard 类之间有任何联系。
  • 你的Card 类不代表卡片,它代表Deck,有点。您可能希望更合乎逻辑地重新组织您的类,并使用枚举而不是 string[] 来表示套件和卡片值。除此之外,CodeReview 是合适的论坛。
  • 必须将卡片类设为静态,所以我不太明白如何建立连接。这也是一个测试项目,所以我所有的错误都在这里整理,我目前正在学习枚举,并将在最终项目中实现它们。
  • @Jody 他的意思是randomisedCards 只是一个new List&lt;string&gt;() 并且您正在洗牌一个空列表,而不使用在Deck 方法中实现的任何套牌生成逻辑。我敢肯定,如果你能更合乎逻辑地重新组织你的类,那么游戏的逻辑在代码中的运行方式将会更加清晰。
  • 好吧,我明白了,现在我该如何解决这个问题,我可以将 Deck() 方法列表随机返回到经销商类吗?

标签: c# list


【解决方案1】:

我认为将 Deck 保存为类中的静态值是一个可怕的想法,我建议这样做:

public static class Cards
{
    private static string[] Suite = new string[4] {"Clubs", "Hearts", "Spades", "Diamonds" };
    private static string[] FaceValue = new string[13] {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" };


    public static List<string> CreateDeck()
    {
        var deck = new List<string>();
        for (int s = 0; s < 4; s++ )
        {
            string sut = Suite[s];

            for (int fV = 0; fV < 13; fV++)
            {
                string value = FaceValue[fV];

                deck.Add(sut + value);
            }
        }
        // End of For loop.
        Shuffle(deck);
        return deck;
    }

    private static void Shuffle<T>(this IList<T> list)
    {
        Random rng = new Random();
        int n = list.Count;
        while (n > 1)
        {
            n--;
            int k = rng.Next(n + 1);
            T value = list[k];
            list[k] = list[n];
            list[n] = value;
        }
    }
}

像这样使用它:

class Dealer
{
    private List<string> randomisedCards;

    public Dealer()
    {
        randomisedCards = Cards.CreateDeck();
    }


    public string dealCard()
    {
        string randCard = randomisedCards[0];
        randomisedCards.RemoveAt(0);

        return randCard;
    }
}

请注意,我没有检查您的代码(CreateDeckShuffle、...)

我还建议通过以下方式使这个更清洁:

  • 为您的Card(Suite、Face)实现一个类
  • 为您的Deck(卡片集合)实现一个类
  • 使一切都不可改变(在外面 - 意思是:你可以按原样洗牌,但不要让别人改变你的牌组 - 为界面创建新牌 - 例如,庄家抽一张牌应该给你一张牌和另一副牌(缺少这张牌)——这提高了你的代码的可测试性

【讨论】:

  • 所以我对 OOP 很陌生......所以 Deck 类不应该继承自 card 类,将其视为卡片中的卡片吗?我也猜测 shuffle 方法应该移动到甲板类并返回洗牌的甲板。我不太明白的是第 3 点...我应该随机发一张牌,然后当我再次发牌时,我必须得到另一副牌,将已分发的牌移除?如果是这样,我会做类似的事情,将手牌添加到集合中,如果选择了随机卡,则必须将其与集合进行比较。
  • 另外,每次使用新牌组进行测试如何更容易?
  • 第一个问题:不 - Deck 类应该只是一堆卡片的表示。 / 随机播放:你可以这样做,但你必须在执行破坏性操作时更改逻辑(就地随机播放)/为什么不可变数据更容易测试:大评论 - 只是几件事:设置很明显,没有可能损害测试的内部状态,并行测试没有问题,不需要对测试进行特殊排序,您可以轻松测试“随机卡片 + 其余卡片组 = 原始卡片组(作为集合)”之类的属性(有使用这些的框架)
  • ... 简而言之:让它发挥作用:D
猜你喜欢
  • 2014-07-03
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多