我试着比较两张牌,但是每次我尝试另一种方法,我得到同样的结果.代码之前的所有内容都会输出,当它到达比较代码时就会冻结,就好像它被困在一个无限循环中一样。
我尝试过循环、静态变量、同时执行循环等等。这是我第一次在客户端代码中离开循环。
据说将程序抛入无限循环的代码。
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张牌都按此模式推送。这使得这张牌有52x2张牌(下半部分是完美的洗牌),所以我用.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中。而且,我认为导致这个问题的原因是,每当我的索引被再次调用时,它就被重置为零。你们有什么解决办法吗?我尝试过使用静态变量,但它们只是在for循环中不会增加。
编辑2:根据用户的要求,我在大括号内附上了if语句,因为这是我代码中的一个缺陷。
编辑3:注释后
deck1.shuffleDeck()compareDecks函数返回true,说明甲板是相等的,这是不应该发生的.这导致循环只在一个循环之后结束。
发布于 2019-09-03 19:22:23
我还以为你真的会洗牌呢。
您的代码正在将一张新合成的特定卡片推到甲板的末端:
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);
}发布于 2019-09-03 18:11:44
您不是在修改循环中的值,而是使用一个双相等号:
repeatLoop == deck1.compareDecks();
可以解释你观察到的行为。
https://stackoverflow.com/questions/57776778
复制相似问题