【发布时间】:2019-09-03 18:09:08
【问题描述】:
我正在尝试比较两副牌,但每次我尝试另一种方法时,我都会得到相同的结果...在代码输出之前的所有内容,并且在进行比较时立即冻结代码,仿佛陷入了无限循环。
我尝试过 for 循环、静态变量、do-while 循环等。这是我第一次将循环留在客户端代码中。
本应使程序陷入无限循环的代码。
while (repeatLoop == false)
{
deck1.shuffleDeck();
counter++;
repeatLoop = deck1.compareDecks();
}
compareDecks 函数。
bool deck::compareDecks()
{
int deckCount = 0;
suitType tempOriginalSuit;
suitType tempShuffleSuit;
rankType tempOriginalRank;
rankType tempShuffleRank;
while (index < 52)
{
tempOriginalSuit = originalCardDeck[index].getSuit();
tempShuffleSuit = shuffledCardDeck[index].getSuit();
if (int(tempOriginalSuit) == int(tempShuffleSuit))
{
tempOriginalRank = originalCardDeck[index].getRank();
tempShuffleRank = shuffledCardDeck[index].getRank();
if (int(tempOriginalRank) == int(tempShuffleRank))
{
deckCount++;
if (deckCount == 52)
return true;
}
}
else
{
return false;
index++;
}
}
}
shuffleDeck 函数 (此功能将第一张牌从牌组的前半部分推回,并将第一张牌从牌组的后半部分推回最后,直到所有 52 张牌都以这种模式推完。这使得牌组有 52 x 2 张牌(甲板的后半部分是完美的洗牌),所以我使用 .erase 删除卡的前半部分,因为它不需要)
void deck::shuffleDeck()
{
for (int a = 0, b = 2; a < 2 && b < 4; a++, b++)
{
for (int i = 2; i < 15; i++)
{
shuffledCardDeck.push_back(card{ static_cast<cardSpace::suitType>(a),
static_cast<cardSpace::rankType>(i) });
shuffledCardDeck.push_back(card{ static_cast<cardSpace::suitType>(b),
static_cast<cardSpace::rankType>(i) });
}
}
shuffledCardDeck.erase(shuffledCardDeck.begin(),
shuffledCardDeck.begin() + (shuffledCardDeck.size() / 2));
}
由这个构造函数初始化的两个卡组。
deck::deck()
{
for (int i = 0; i < 4; i++)
{
for (int j = 2; j < 15; j++)
{
originalCardDeck.push_back(card{ static_cast<cardSpace::suitType>(i),
static_cast<cardSpace::rankType>(j) });
shuffledCardDeck.push_back(card{ static_cast<cardSpace::suitType>(i),
static_cast<cardSpace::rankType>(j) });
}
}
}
另外请注意,我已经在另一个函数中对 shuffledCardDeck 向量进行了完美的随机播放。我正在尝试重复 perfectShuffle 函数,直到它达到原始状态并输出执行此操作所需的次数。
我得到一个无限循环。
编辑:我决定添加 return false;将 compareDecks 函数中的语句放入 if-else。另外,我认为导致问题的原因是我的索引 i 每次被再次调用时都会重置为零。你们有什么解决方案可以提出来吗?我尝试过使用静态变量,但它们不会在 for 循环中递增。
编辑 2:根据用户的要求,我将 if 语句括在花括号中,因为这是我的代码中的一个缺陷。
编辑3:注释掉后
deck1.shuffleDeck()
compareDecks 函数返回 true,表示甲板是相等的,这不应该发生......这导致循环仅在一个循环后结束。
【问题讨论】:
-
小心:我担心
if (deckCount == 52)会缩进。它不是是if (int(tempOriginalRank) == int(tempShuffleRank))条件块的一部分 - 没有大括号{ }包围它。 -
如果注释掉
shuffleDeck的用法,compareDecks是否返回 true? -
使用调试器,单步执行无限循环(或至少循环很长时间)的代码,然后弄清楚什么是楔入的。使用调试器是一项非常宝贵的编程技能。
-
@AngoMango 为了一笑而过,只需将其更改为
&&。循环的中间部分是使循环继续的条件。我想你已经被逗号操作符咬了。循环的中间部分必须是计算结果为true或false的表达式。 -
while (repeatLoop == false)感觉真的错了。不应该是while (repeatLoop == true)吗?
标签: c++ object vector infinite-loop