首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的输出在到达代码的这一部分时会冻结呢?

为什么我的输出在到达代码的这一部分时会冻结呢?
EN

Stack Overflow用户
提问于 2019-09-03 18:09:08
回答 2查看 92关注 0票数 0

我试着比较两张牌,但是每次我尝试另一种方法,我得到同样的结果.代码之前的所有内容都会输出,当它到达比较代码时就会冻结,就好像它被困在一个无限循环中一样。

我尝试过循环、静态变量、同时执行循环等等。这是我第一次在客户端代码中离开循环。

据说将程序抛入无限循环的代码。

代码语言:javascript
复制
    while (repeatLoop == false)
    {
        deck1.shuffleDeck();
        counter++;
        repeatLoop = deck1.compareDecks();
    }

compareDecks函数

代码语言:javascript
复制
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删除了前半部分,因为它是不需要的)

代码语言:javascript
复制
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));
}

由此构造函数初始化的两个甲板。

代码语言:javascript
复制
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:注释后

代码语言:javascript
复制
deck1.shuffleDeck()

compareDecks函数返回true,说明甲板是相等的,这是不应该发生的.这导致循环只在一个循环之后结束。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-03 19:22:23

我还以为你真的会洗牌呢。

您的代码正在将一张新合成的特定卡片推到甲板的末端:

代码语言:javascript
复制
           shuffledCardDeck.push_back(card{ static_cast<cardSpace::suitType>(a),
                                            static_cast<cardSpace::rankType>(i) });

例如,它将推出的第一张牌总是0中的2(无论第0套是什么)。这不是你想要的。您实际上想要推送卡的副本,这是在一个特定的位置,index在甲板上。例如,将index0循环到25,然后推送shuffledCardDeck[index]shuffledCardDeck[26 + index]

然后,你仍然可以用你的技术抹去甲板的前半部。

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2019-09-03 18:11:44

您不是在修改循环中的值,而是使用一个双相等号:

repeatLoop == deck1.compareDecks();

可以解释你观察到的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57776778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档