gpt4 book ai didi

c++ - 无法在 C++ 中生成一副纸牌

转载 作者:行者123 更新时间:2023-11-27 23:42:15 27 4
gpt4 key购买 nike

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

卡片类:

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++;
}
}

感谢您的帮助。

最佳答案

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

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

还有关于它在卡片生成过程中的某个时刻停止,请引用@Stephan Lechner 的评论。

Once duplicateCard has somewhere become true, it will never get false again. Then while (duplicateCard == true) will be an endless loop

关于c++ - 无法在 C++ 中生成一副纸牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53660728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com