为什么我的输出在到达代码的这一部分时冻结?
Why is my output freezing when it gets to this section of the code?
我试图比较两副牌,但每次我尝试另一种方法时,我都会得到相同的结果......代码输出之前的所有内容,一旦到达比较代码,它就会冻结,就好像它陷入了无限循环一样。
我已经尝试过循环、静态变量、做而做的循环等。这是我第一次在客户端代码上离开循环。
据称将程序抛入无限循环的代码。
while (repeatLoop == false)
{
deck1.shuffleDeck();
counter++;
repeatLoop = deck1.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++;
}
}
}
洗牌功能 (此函数将第一张牌从前半张牌推回牌组的前半部分,将第一张牌从牌组的后半部分推到最后,直到所有 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 函数,直到它达到原始状态并输出执行此操作所需的次数。
我得到一个无限循环。
编辑:我决定将 compareDecks 函数中的返回 false; 语句添加到 if-else 中。另外,我认为导致问题的原因是我的索引 i 每次再次调用时都会重置为零。你们有什么解决方案可以提出吗?我尝试使用静态变量,但它们不会在 for 循环中递增。
编辑2:根据用户的要求,我将if语句括在大括号内,因为这是我代码中的一个缺陷。
编辑3:注释掉后
deck1.shuffleDeck()
compareDecks 函数返回 true,指出套牌相等,这不应该发生......这导致循环仅在一个循环后结束。
我期待你真的洗牌。
你的代码正在将一张特定的、新合成的卡片推到牌组的末端:
shuffledCardDeck.push_back(card{ static_cast<cardSpace::suitType>(a),
static_cast<cardSpace::rankType>(i) });
例如,它将推送的第一张牌始终是 0 中的 2(无论第 0 个花色是什么(。 那不是你想要的。 您实际上想要推送位于牌组中特定位置index
牌的副本。 例如,将index
从0
循环到25
,然后推送shuffledCardDeck[index]
并shuffledCardDeck[26 + index]
。
然后,您仍然可以使用擦除甲板前半部分的技术来结束。
void deck::shuffleDeck()
{
for (int index = 0; index < 26; ++index) {
shuffledCardDeck.push_back(shuffledCardDeck[index]);
shuffledCardDeck.push_back(shuffledCardDeck[26 + index]);
}
shuffledCardDeck.erase(shuffledCardDeck.begin(),
shuffledCardDeck.begin() + 52);
}
您没有修改循环中的值,而是使用双等号:
repeatLoop == deck1.compareDecks();
这可以解释你观察到的行为。
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 分配给gslice_array会导致运行时错误
- 将双精度值分配给 int 数组时的类型转换
- 为什么双精度引用值在分配给C++中的浮点变量时不会更改
- 为什么SADWinowSize_slider的跟踪栏的值在分配给 sbm->state 时变为 0。SADWindowSize,在我的代码中
- 错误:将"long int (*)[4]"分配给"long int [4][4]"时的类型不兼容
- 当我输入分数值时,它返回不正确的结果
- C 在将数组引用分配给struct时麻烦
- 将内存分配给 2D 数组时,“new int*[rowCount];”的含义是什么?是 2D 数组,是指向数组的指针数组
- 如何在当前时间,显示标头并将随机出生日期分配给X人数(C )时如何播种随机数生成器(C )
- 分割内存位置后,将内存分配给MALLOC()时分割故障
- SIGABRT(信号6)在使用分治法查找阵列中的多数元素时出错
- 将 (cin >> someVar) 的返回分配给 istream 变量时出错 C++
- 在将值分配给 CString 时获取<错误 Ptr> 和无效值
- 尝试扩展 ctype 分面时出现未定义的引用错误
- 将内存分配给void*时的gcc-calloc行为
- 为什么当我将 true 分配给 int 变量时编译器不抱怨?
- 当我的电脑得分达到100分时,游戏还没有结束