如何跟踪C ++中Hangman游戏中猜到的字母?

时间:2013-11-26 02:57:33

标签: c++ arrays string

过去两天我一直试图修复这个程序,事实证明这很麻烦。这是我对C ++课程的介绍,并给了我一些麻烦。我在Cplusplus.com上发布了这个主板,并在Google上花了几个小时寻找帮助。

这是我的问题。我得到了一个程序,需要添加一些功能:

  1. 我必须保存用户条目。
  2. 如果用户输入两次相同的条目,我必须显示错误消息。
  3. 好像很简单?不适合像我这样的初学者。这是代码,我试图添加它以满足问题的要求。

    int main()
    {
        //declare variables
        string origWord = "";
        string letter = "";
        char dashReplaced = 'N';
        char gameOver = 'N';
        int numIncorrect = 0;
        string displayWord = "-----";
        string letterGuess[26];
    
        //get original word
        do //begin loop
        {
            cout << "Enter a 5-letter word in uppercase: ";
            getline(cin, origWord);
        } while (origWord.length() != 5);
    
        //clear the screen
        system("cls");
    
        //start guessing
        cout << "Guess this word: " <<
        displayWord << endl;
    
        while (gameOver == 'N')
        {
            cout << "Enter an uppercase letter: ";
            cin >> letter;
    
            //Entry Storage and Error Message. This is my problem.
            for (int x = 0; x < 26; x++)
            {
                letterGuess[x] = letter;
                for (int i = x; i < 26; i++)
                {
                    if (i != x)
                    {
                        if (letterGuess[x] == letterGuess[i])
                        {
                            cout << "Letter already entered. Choose another letter."
                            << endl;
                        }
                    }
                }
            }
    
            //search for the letter in the original word
            for (int x = 0; x < 5; x += 1)
            {
                //if the current character matches
                //the letter, replace the corresponding
                //dash in the displayWord variable and then
                //set the dashReplaced variable to 'Y'
    
                if (origWord.substr(x, 1) == letter)
                {
                    displayWord.replace(x, 1, letter);
                    dashReplaced = 'Y';
                } //end if
            } //end for
    
            //if a dash was replaced, check whether the
            //displayWord variable contains any dashes
    
            if (dashReplaced == 'Y')
            {
                //if the displayWord variable does not
                //contain any dashes, the game is over
    
                if (displayWord.find("-", 0) == -1)
                {
                    gameOver = 'Y';
                    cout << endl << "Yes, the word is "
                    << origWord << endl;
                    cout << "Great guessing!" << endl;
                }
                else //otherwise, continue guessing
                {
                    cout << endl << "Guess this word: "
                    << displayWord << endl;
                    dashReplaced = 'N';
                } //end if
            }
            else //processed when dashReplaced contains 'N'
            {
                //add 1 to the number of incorrect guesses
                numIncorrect += 1;
                //if the number of incorrect guesses is 10,
                //the game is over
                if (numIncorrect == 10)
                {
                    gameOver = 'Y';
                    cout << endl << "Sorry, the word is "
                    << origWord << endl;
                } //end if
            } //end if
        } //end while
    
        system("pause");
        return 0;
    } //end of main function
    

    我对程序的唯一编辑直接位于条目存储和错误消息的标题下。我尝试了一个for循环,但是只显示输入的每个字母的错误消息。不仅如此,它还显示了26次。添加一个Break命令修复了它,它只显示一次。但是,它仍会显示在每个条目上。

    Cplusplus的一名成员指出,我错误地在同一位置对阵列测试相同的变量。这就是它在每个条目上显示错误的原因。现在使用此循环,仅在输入两次条目时才会显示错误。但是,错误消息再次显示26次。最重要的是,只有一个接一个地输入字母才会出错。

    例如,如果我再次输入A然后是X然后输入A,则不会显示错误。如果我再次输入A,然后再输入A,则错误显示26次。在导致错误消息多次显示的任何内容之外,字母变量如何输入到数组中显然是错误的。

    非常感谢任何数量的帮助。

    编辑:我的教授已经回复我并建议使用以下内容而不是我一直在修补的内容:

    for (int x=0; x<5; x++)
     if (origWord[x] == letterEntered)
        origWord[x] = '-';
    

    这只是我,还是完全错过了这个标记?我没有尝试将其转换为我的程序,因为简单的复制和粘贴作业会产生编译错误。但是,我不知道这对我正在尝试做什么有什么用。

2 个答案:

答案 0 :(得分:1)

此设置是letterGuess数组中最近猜到的字母的所有条目。

letterGuess[x] = letter;

这不是你想要的。

您需要考虑需要实施的实际算法:

  1. 用户输入猜测
  2. 检查他们是否已经猜到了那封信
  3. 如果有,则显示错误消息,返回1.
  4. 如果他们没有,除了猜测,继续游戏逻辑。
  5. 如果您已经了解了标准容器,可以使用已排序的std::setstd::vector轻松完成此操作。

答案 1 :(得分:0)

您需要将数组中的每个元素与猜测的单词进行比较。最好使用for循环。如果这是一项任务,就不再需要说了。

也不要在你的程序中使用system("cls"),这是一个巨大的安全漏洞,可能会失去你的标记。