c++ - 无法在 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++;
}
}
感谢您的任何帮助。
解决方案
如果要混合生成 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) 将是一个无限循环
推荐阅读
- javascript - 使用 javascript 选择 iframe 内的单选按钮
- ruby-on-rails - 如何用随机字符替换字符串中间的字符?
- reactjs - 使 Material-UI div 固定在页面顶部始终可见,即使页面向下滚动也是如此
- model-checking - 如何解释 NuXMV 的 msat LTL 命令的结果
- aframe - 虚拟现实世界相机html
- typescript - 如何将 addEvent 函数转换为 Typescript?
- glsl - 着色器:如何在不生成几何图形的情况下绘制 3D 点顶点?
- angular - Bootstrap 类在 Window.print 中不起作用
- c++ - C++ 相同的值是随机生成的,有两个 for 循环
- math - 如何强制 AWK 将字符串评估为数学表达式?