如何在C++实现的简易Hangman游戏中检测用户重复输入的字母
Hangman游戏代码问题修复
问题根因
你当前代码出现重复输入正确字母误判的核心原因是没有对已猜对的字母做记录:
- 每次输入正确字母都会直接给
count加1,哪怕该字母之前已经成功猜对过,重复输入会导致count虚高,提前达到单词总长度触发错误判定。 - 额外逻辑缺陷:你当前的输出逻辑写反了,猜对所有单词输出
HANGMAN!不符合Hangman游戏规则,应该是猜错字母时触发失败输出HANGMAN!,猜对所有字母输出胜利提示。
修复方案
我们可以用一个长度26的布尔数组记录A-Z每个字母是否已经被猜对过,每次输入新字母先校验是否已猜对,仅首次猜对有效字母时才累加计数。
修复后完整代码
#include <iostream> #include <cstring> using namespace std; int main() { // 待猜单词最长20字符(含结束符) char HangmanWord[20]; char GuessLetter; int count = 0; cin >> HangmanWord; bool valid = true; // 新增:记录26个大写字母是否已经被猜对过 bool guessed[26] = {false}; // 校验输入单词仅包含大写英文字母 for (int i = 0; i < strlen(HangmanWord); i++) { if ((HangmanWord[i] > 'Z') || (HangmanWord[i] < 'A')) { valid = false; break; } } while (valid == true) { cin >> GuessLetter; // 校验输入为大写字母,否则退出 if ((GuessLetter > 'Z') || (GuessLetter < 'A')) { break; } // 新增:如果该字母已经猜对过,直接跳过后续判断 if (guessed[GuessLetter - 'A']) { continue; } bool isCorrect = false; for (int i = 0; i < strlen(HangmanWord); i++) { if (GuessLetter == HangmanWord[i]) { isCorrect = true; // 标记该字母已猜对 guessed[GuessLetter - 'A'] = true; count++; break; } } // 猜错直接结束游戏输出HANGMAN if (!isCorrect) { valid = false; cout << "HANGMAN!\n"; break; } // 所有字母都猜对,输出胜利提示 if (count == strlen(HangmanWord)) { valid = false; cout << "恭喜你猜对了所有字母!\n"; break; } } return 0; }
验证效果
待猜单词为HAM时,用户依次输入H、A、A:
- 输入H:首次猜对,count=1,标记H已猜
- 输入A:首次猜对,count=2,标记A已猜
- 输入A:检测到已猜对,直接跳过,count保持2,不会达到3触发错误判定
内容的提问来源于stack exchange,提问作者AZRAEL
相关产品推荐
相关产品推荐

