【问题标题】:Loop works/doesn't work, not sure why C++循环工作/不工作,不知道为什么 C++
【发布时间】:2014-01-04 11:19:29
【问题描述】:

我在此代码末尾附近的 for 循环遇到问题。

该循环是针对刽子手游戏的,本质上,该循环通过带有密码字的char 数组循环,并将用户猜测与char 数组中的每个元素进行比较。如果找到,则更新输出以显示该字母并将计数器重置为 0,否则如果计数器等于密码字的长度,则表示循环 找到 @987654324 @ 并且它应该在显示器上加一(对于绞刑架)并且将不正确的猜测放入错误的猜测数组中。

我在这里遇到的问题是,在大多数情况下,循环按预期工作,但偶尔它会读取一个正确的答案,因为它既正确 并且仍然正确将其放入错误的猜测数组中,并增加绞刑架显示值。

这似乎是随机的,而且只有在我玩第二个游戏时才会这样做。我认为这是计数器的问题,但我在 while 循环开始时将其重置为 0,并在 for 循环中重置为零 if 找到正确答案.

所以我不知道为什么它会将正确答案读作正确并仍将其放在wrongChoice 数组中,因为此时的计数器应该wordLength - 1。代码如下:

while(!winner)
        {
            count = 0;
            for(int i = 0; i < secretWord.length(); i++)
                cout << userPrompt[i] << " ";
            cout << "\n" << endl;
            cout << "Wrong Guess: ";
            for(int i = 0; i < (secretWord.length() + 6); i++)
            {
                cout << userChoice[i] << " ";
            }
            cout << "\n" << endl;
            displayGallows(display);

            if(display == 6)
            {
                cout << "Sorry, you lost!" << endl;
                break;
            }

            cout << "Enter a letter: ";
            cin >> userGuess;
            while(!cin)
            {
                cin.ignore();
                cin.clear();
                cin.sync();
                cout << "Error reading input character! Try Again!" << endl;
                cout << "Enter a letter: ";
                cin >> userGuess;
            }
            guessCount++;
            cin.ignore();
            for(int i = 0; i < secretWord.length(); i++)
            {
                if(word[i] == tolower(userGuess))
                {
                    userPrompt[i] = tolower(userGuess);
                    count = 0;
                }
                else if(count == (wordLength - 1))
                {
                    display++;
                    userChoice[guessCount - 1] = toupper(userGuess);
                }
                count++;
            }
            winner = checkWin(word, userPrompt, display, secretWord);       
        }
        again = playAgain();

【问题讨论】:

  • 听起来像是您选择的调试器的工作。
  • 其实,这只是我编程的第一个学期,我们的老师并没有在意教我们如何使用调试器.....我曾尝试使用 Visual Basics 调试器,但自从我我是一个完全的新手,我没有运气试图自己弄清楚那个调试器,我们的老师说我们下学期学习如何使用调试器:/很难自己弄清楚所有这些东西......我去这些板子,因为它需要至少 5 天的时间来回复我们的电子邮件查询,到那时项目或作业已经到期
  • 说了这么多,这就是为什么我在发帖时尽量解释它,包括我假设代码应该如何运行,以表明我正在尝试从这些中学习,而不仅仅是得到一个快速的答案继续前进......我真的很想知道/理解编码,而不仅仅是得到一个快速的 A
  • 编辑您的帖子并稍微清理一下您的代码...尤其是在您弄清楚答案后。您可能会收回您的反对票...(cout
  • 缺少调试器,最好的办法是找出你认为出错的变量的值。这样您就可以缩小出错的范围。

标签: c++ loops for-loop while-loop loop-counter


【解决方案1】:

这里是一个猜测,但它是否只是/总是第一个字符给你带来问题?

如果 userGuess 在 word[] 某处,则使用 count 作为检测器,但如果它在 word[] 中的第一个字符处,则 count 仍会以与第一个字符错误的方式相同的方式递增。因此,在循环结束时,它 采用了错误选择的分支。你真正想要的是在循环结束后检查......不是循环的每次迭代!

试试这个:

        bool found = false;
        for(int i = 0; i < secretWord.length(); i++)
        {
            if(word[i] == tolower(userGuess))
            {
                userPrompt[i] = tolower(userGuess);
                found = true;
            }
        }

        if( !found )
        {
            display++;
            userChoice[guessCount - 1] = toupper(userGuess);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多