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

