【问题标题】:Deal cards from a 52 card deck reduced to 11 different types of cards发牌从 52 张牌组减少到 11 种不同类型的牌
【发布时间】:2016-10-01 12:59:31
【问题描述】:

所以我必须将 Black Jack 编程为 C# 中的控制台程序。我添加了一个枚举,其中包含所有不同的卡片类型(没有颜色,只有从 2 到 10 的 9 个不同数字,一个用于 ace 的值,一个用于图片卡片)具有 11 个不同的值。

然后我创建了一个从该枚举中返回随机卡片的方法。这工作正常。但是在任务的第二步中,我必须添加图片卡,并且我必须处理卡片组中图片卡的数量。这副牌共有 52 张卡片,其中 12 张是图片卡片。我尝试了以下方法,但它不起作用。

class Program
{
    static Random rnd = new Random(); //Initialisierung Zufallsgenerator
    static ECARDS DrawRandomCard() //Methode zum zufälligen ziehen einer Karte aus dem enum ECARDS
    {
        if ((int)DrawRandomCard() < 12)
        {
            return ECARDS.Picture;
        }
        else
        {
            return (ECARDS)rnd.Next(2, 11);
        }            
    }

    enum ECARDS { Zwei = 2, Drei = 3, Vier = 4, Fünf = 5, Sechs = 6, Sieben = 7, Acht = 8, Neun = 9, Zehn = 10, Ass = 11, Picture = 99 }; // enum mit allen verfügbaren Karten

我是新人,所以也许对你来说很容易。感谢您的帮助。

【问题讨论】:

  • 检测到无限递归。
  • 你不能只选择这样的数字——没有什么可以限制它处理比一副牌实际拥有的更多的 2 或 8。你需要一个真实世界的牌组,有 4 个 2s、4 个 7s 等。This might be helpful
  • DrawRandomCard() 中的第一条指令是对自身的无条件调用。
  • 关于随机生成卡片。如果生成随机牌,不排除连续获得 10 个 ace。最好将剩余卡片存储在表格中或列表中。只需在其余的中随机选择。

标签: c# random enums


【解决方案1】:

您将问题分解为二十一点所需的不同类型的牌的方法很好。

但是,正如 @Plutonix 和 @Jean-Claude Colette 已经提到的,您需要确保您的 52 张牌组最初具有正确比例的不同牌型(每个数字 4 张、4 张 A 和 12 张“图片”牌) )。

接下来,在发牌的过程中,您必须跟踪已经发牌的牌(或者说,在牌组中还剩下哪些牌)。

处理这两个约束的最简单方法是声明一个长度为52ECARDS 枚举值的数组(或列表),并以正确的比例用ECARDS 实例预填充它(顺序不事情)。之后你 randomly shuffle 数组来获得一个完全随机的牌组(几乎是现实世界中发生的事情)。

现在您可以开始分发从索引051 的遍历数组的卡片。如果您已到达最后一个可能的索引 (51),您只需重新排列数组并再次从索引 0 开始遍历。

下面的例子用来说明这个想法。它是用 Java 编写的,而不是 C#。因此,将其解释为伪代码。

class Deck {

    static final int DECK_SIZE = 52;
    ECARDS[] c = new ECARDS[DECK_SIZE];
    Random rnd = new Random();
    int idxNextCard = 0;

    Deck() {
        populateDeck();
        reshuffleDeck();
    }

    void reshuffleDeck() {
        for (int i = c.length - 1; i > 0; i--) {
            int j = rnd.nextInt(i + 1);
            ECARDS cj = c[j];
            c[j] = c[i];
            c[i] = cj;
        }
        idxNextCard = 0;
    }

    ECARDS drawNextCard() {
        if (idxNextCard == c.length - 1) {
            reshuffleDeck();
        }
        return c[idxNextCard++];
    }

    void populateDeck() {
        int i = 0;
        for (ECARDS ec : ECARDS.values()) {
            if (ec == ECARDS.Picture) {
                for (int j = 0; j < 12; j++) {
                    c[i++] = ec;
                }
            } else {
                for (int j = 0; j < 4; j++) {
                    c[i++] = ec;
                }
            }
        }
    }

    public static void main(String[] args) {
        Deck d = new Deck();
        for (int i = 0; i < 10 * DECK_SIZE; i++) {
            if (i % DECK_SIZE == 0) {
                System.out.println();
            }
            System.out.print(d.drawNextCard() + ", ");
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多