首页 > 解决方案 > 无法在 C++ 中生成一副纸牌

问题描述

我正在制作一个项目,用 C++ 模拟扑克游戏。目前,每当我在 Visual Studio 的调试模式下通过它时,我所拥有的功能似乎都可以工作。但是,每当我实际运行程序时,控制台光标只会闪烁,并且似乎不会在类的初始化之后执行。如果我在调试模式下进行,它会在卡生成过程中的某个时间点停止。我知道卡片生成不是随机的,为了简单起见,我删除了它。

Card班级:

class Card
{
    public:
    string value;
    string suit;
    int ValToInt();
};

Deck班级:

class Deck
{
public:
    int deckSize;
    Card deck[52];
    void RandCard(Card &card);
    Deck();
};

RandCard功能:

void Deck::RandCard(Card &card)
{
    bool duplicateCard = false;
    Card tempCard;
    const string valueList[13] = { "A","2","3","4","5","6","7","8","9","10","J","Q","K" };
    const string suitList[4] = { "s", "c", "h", "d" };
    do {
        tempCard.value = valueList[rand() % 13];
        tempCard.suit = suitList[rand() % 4];

        for (int i = 0; i < deckSize; i++)
        {
            if ((deck[i].value == tempCard.value) && (deck[i].suit == tempCard.suit))
            {
                duplicateCard = true;
                break;
            }
        }
    } while (duplicateCard == true);
    card = tempCard;
}

默认构造函数以及我如何尝试使用该RandCard函数:

Deck::Deck()
{
    deckSize = 0;
    Card emptyCard;
    emptyCard.value = "EMPTY";
    emptyCard.suit = "EMPTY";
    for (int i = 0; i < 52; i++)
    {
        RandCard(deck[i]);
        deckSize++;
    }
}

感谢您的任何帮助。

标签: c++

解决方案


如果要混合生成 52 张牌,最好的办法是生成 52 张牌并使用 std::shuffle 或 std::random_shuffle。这背后是有原因的。想象以下场景:

您已经生成了 51 张卡片,即将生成第 52 张卡片。您正在随机生成一张卡片并检查它是否已经在牌组中。获得独特卡片的几率为 1/52。对于第 51 张牌,赔率为 2/52,依此类推。因此,您正在做不必要的无数次迭代来随机生成最后几张卡片。事实上,在第 19 张左右之后,重复一张牌的概率非常高。因此, std::shuffle 是你的朋友。

同样对于it stops at some point during the generation of the cards,请参阅@Stephan Lechner 的评论。

一旦 duplicateCard 在某处变为真,它就永远不会再变为假。那么 while (duplicateCard == true) 将是一个无限循环


推荐阅读