You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Hangman游戏代码报错求助:guessedWord未初始化问题排查

Hangman游戏C++代码错误排查与修复

问题概述

我是编程新手,编写了一段实现Hangman(刽子手)游戏的C++代码,运行时提示guessedWord未初始化错误,无法自行排查代码中的问题,同时也不清楚如何使用教授提供的伪代码,希望有人帮忙指出代码中的错误并解决问题。

以下是我的原始代码:

#include <iostream>
#include <string>
int main()
bool guessedWord;
bool wantsToPlay;
char answer;
int errorCount = 0;
char userGuess;

char letter1 = '_', letter2 = '_', letter3 = '_', letter4 = '_', letter5 = '_', letter6 = '_';  // Letters to store and display the hidden characters
string hiddenWord = "BASICS";
string availableLetters = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"; // Alphabet
string gallow1 = "     |------|--";     // Gallows to display hangman image
string gallow2 = "     |      ";
string gallow3 = "     |      ";
string gallow4 = "     |     ";
string gallow5 = "     |    ";
string gallow6 = "   ====== ";



cout << endl;   // START TURN
cout << endl;

cout << gallow1 << endl;    // Gallows Display
cout << gallow2 << endl;
cout << gallow3 << endl;
cout << gallow4 << endl;
cout << gallow5 << endl;
cout << gallow6 << endl;
cout << endl;
cout << endl;

// Display hidden letters and alphabet
cout << letter1 << " " << letter2 << " " << letter3 << " " << letter4 << " " << letter5 << " " << letter6 << " " << endl << endl;
cout << availableLetters << endl << endl;

cout << "Please enter your letter choice >>";
cin >> userGuess;
userGuess = toupper(userGuess);

do  //plays a new game
{
    do //play specific game
    {
                                            //Change guessed word or add error count,
                                         

        if (userGuess == hiddenWord[0]) // checking for a match
        {
            letter1 = userGuess;                
            availableLetters[2] = '_';
        }
        else if (userGuess == hiddenWord[1])
        {
            letter2 = userGuess;
            availableLetters[0] = '_';
        }
        else if (userGuess == hiddenWord[2])
        {
            letter3 = userGuess;
            letter6 = userGuess;
            availableLetters[36] = '_';
        }
        else if (userGuess == hiddenWord[3])
        {
            letter4 = userGuess;
            availableLetters[16] = '_';
        }
        else if (userGuess == hiddenWord[4])
        {
            letter5 = userGuess;
            availableLetters[4] = '_';
        }
        else
        {
            errorCount++;
            if (errorCount == 1)
                gallow2 += "O";         //Add a head
            else if (errorCount == 2)
                gallow3 += "|";         //Add a body
            else if (errorCount == 3)
                gallow3.at(11) = '/';   //Add a right arm
            else if (errorCount == 4)
                gallow3 += "\\";        //Add a left arm
            else if (errorCount == 5)
                gallow4 += "/";         //Add a right leg
            else if (errorCount == 6)
        }
        
    } while (guessedWord == false || errorCount < 6);
    
    if (guessedWord == true)
    {
        cout << "YAY!!!! YOU WIN" << endl;
    }
    else
    {
        cout << "You are dead" << endl;
    }
    cout << "Do you want to play again?" << endl;
    cout << "Y / N" << endl;
    cin >> answer;

    if (answer == 'N')
        wantsToPlay = false;
} while (wantsToPlay == true);
cout << "BYE" << endl;


cout << "GAME OVER....\n\n";

system("pause");
return 0;

代码中的错误点

  • 变量未初始化:bool guessedWord和bool wantsToPlay是局部变量,C++不会自动初始化局部变量,导致运行时出现未定义行为,这就是你看到的guessedWord未初始化错误的原因。
  • 主函数语法错误:int main()后缺少左大括号{,代码结构完全混乱,编译器无法正确解析。
  • 循环逻辑错位:游戏的界面绘制、输入获取都在循环外部,只会执行一次,单局游戏内无法重复接收用户猜测。
  • 胜利条件未实现:guessedWord变量从未被设置为true,不管用户是否猜完所有字母,都不会触发胜利判定。
  • 刽子手绘制不完整:errorCount == 6的分支没有代码,应该添加左腿的绘制逻辑。
  • 硬编码的字符处理:用letter1到letter6硬编码隐藏单词的显示,只适用于固定长度的单词,不够灵活;availableLetters的索引也是硬编码,容易出现越界或逻辑错误。
  • 重复猜测未处理:没有判断用户是否重复猜测同一个字母,会导致错误计数不合理或重复修改显示内容。

修正后的代码

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    bool wantsToPlay = true;

    while (wantsToPlay)
    {
        bool guessedWord = false;
        int errorCount = 0;
        char userGuess;
        string hiddenWord = "BASICS";
        string displayedWord(hiddenWord.length(), '_');
        string availableLetters = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z";
        
        string gallow1 = "     |------|--";
        string gallow2 = "     |      ";
        string gallow3 = "     |      ";
        string gallow4 = "     |     ";
        string gallow5 = "     |    ";
        string gallow6 = "   ====== ";

        while (!guessedWord && errorCount < 6)
        {
            system("cls");

            cout << gallow1 << endl;
            cout << gallow2 << endl;
            cout << gallow3 << endl;
            cout << gallow4 << endl;
            cout << gallow5 << endl;
            cout << gallow6 << endl;
            cout << endl;

            for (char c : displayedWord)
            {
                cout << c << " ";
            }
            cout << endl << endl;
            cout << "可用字母: " << availableLetters << endl << endl;

            cout << "请输入你猜测的字母 >> ";
            cin >> userGuess;
            userGuess = toupper(userGuess);

            if (availableLetters.find(userGuess) == string::npos)
            {
                cout << "你已经猜过这个字母了,请重新输入!" << endl;
                system("pause");
                continue;
            }

            size_t pos = availableLetters.find(userGuess);
            if (pos != string::npos)
            {
                availableLetters[pos] = '_';
                if (pos + 1 < availableLetters.length())
                {
                    availableLetters[pos + 1] = '_';
                }
            }

            bool correctGuess = false;
            for (int i = 0; i < hiddenWord.length(); i++)
            {
                if (hiddenWord[i] == userGuess)
                {
                    displayedWord[i] = userGuess;
                    correctGuess = true;
                }
            }

            if (displayedWord == hiddenWord)
            {
                guessedWord = true;
                continue;
            }

            if (!correctGuess)
            {
                errorCount++;
                switch (errorCount)
                {
                    case 1:
                        gallow2 += "O";
                        break;
                    case 2:
                        gallow3 += "|";
                        break;
                    case 3:
                        gallow3.at(11) = '/';
                        break;
                    case 4:
                        gallow3 += "\\";
                        break;
                    case 5:
                        gallow4 += "/";
                        break;
                    case 6:
                        gallow4 += "\\";
                        break;
                }
            }
        }

        system("cls");
        cout << gallow1 << endl;
        cout << gallow2 << endl;
        cout << gallow3 << endl;
        cout << gallow4 << endl;
        cout << gallow5 << endl;
        cout << gallow6 << endl;
        cout << endl;

        if (guessedWord)
        {
            cout << "YAY!!!! 你赢了!" << endl;
        }
        else
        {
            cout << "你输了,正确单词是:" << hiddenWord << endl;
        }

        char answer;
        cout << "想再玩一局吗?(Y/N) >> ";
        cin >> answer;
        answer = toupper(answer);
        if (answer == 'N')
        {
            wantsToPlay = false;
        }
    }

    cout << "BYE!" << endl;
    system("pause");
    return 0;
}

修正说明

  1. 初始化变量:所有bool变量都初始化为明确的true或false,避免未定义行为。
  2. 修复语法错误:补上主函数的左大括号,整理代码结构。
  3. 重构循环逻辑:外层循环控制多局游戏,内层循环控制单局游戏的猜测流程,每局游戏重新初始化所有相关变量。
  4. 实现胜利条件:通过比较displayedWord和hiddenWord判断是否猜完所有字母,设置guessedWord为true。
  5. 完善刽子手绘制:补上errorCount ==6时的左腿绘制逻辑。
  6. 优化显示逻辑:用displayedWord字符串替代硬编码的letter1到letter6,适配任意长度的单词。
  7. 处理重复猜测:检查用户输入的字母是否还在availableLetters中,避免重复猜测。
  8. 更灵活的字母标记:通过查找字母在availableLetters中的位置来标记已使用,替代硬编码的索引。

内容的提问来源于stack exchange,提问作者Neo anderson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:20:15