C语言Hangman游戏循环计数失效及猜字母逻辑对接求助
Hangman游戏核心问题修复指南
核心问题拆解
你的代码目前存在几个致命逻辑错误,导致计数器不工作、游戏流程异常:
- 掩码数组类型错误:用
int mask[200]存储下划线字符,应该改为char类型,否则字符存储和输出会出现异常。 - 循环逻辑完全失效:
for循环里直接写了return 0,导致第一次循环就终止程序;且循环内没有重新读取用户输入,也没有判断输入字母是否正确的逻辑。 - 计数器触发条件缺失:没有区分"猜对"和"猜错"的情况,无论输入什么都直接进入
else分支输出胜利提示,计数器根本没有机会递增。 - 变量类型不匹配:
strlen返回size_t类型,用char m存储可能导致长度溢出,应改为int或size_t。 - 初始Hangman图案绘制时机错误:一开始就画了完整的吊死图案,应该只在猜错时逐步绘制。
修正后的完整代码
#include<stdio.h> #include<string.h> #include<stdlib.h> #include <time.h> #define ARRAY_SIZE 10 // 逐步绘制Hangman的函数 void drawHangman(int wrongGuesses) { printf("\n"); switch(wrongGuesses) { case 0: printf("=========\n"); break; case 1: printf("+\n|\n|\n|\n|\n|\n=========\n"); break; case 2: printf("+---+\n| |\n|\n|\n|\n|\n=========\n"); break; case 3: printf("+---+\n| |\n| O\n|\n|\n|\n=========\n"); break; case 4: printf("+---+\n| |\n| O\n| |\n|\n|\n=========\n"); break; case 5: printf("+---+\n| |\n| O\n| /| \n|\n|\n=========\n"); break; case 6: printf("+---+\n| |\n| O\n| /|\\\n|\n|\n=========\n"); break; case 7: printf("+---+\n| |\n| O\n| /|\\\n| / \n|\n=========\n"); break; case 8: printf("+---+\n| |\n| O\n| /|\\\n| / \\\n|\n=========\n"); printf("\nReally left me hanging there buddy\n"); break; } } int main() { // 随机单词数组 char word[ARRAY_SIZE][200] = { "tiger", "lion", "elephant", "zebra", "horse", "camel", "deer", "crocodile", "rabbit", "cat" }; int x = 0; srand((unsigned int)time(0)); x = rand() % ARRAY_SIZE; int wordLength = strlen(word[x]); // 掩码数组改为char类型 char mask[200]; for (int i = 0; i < wordLength; ++i) { mask[i] = '_'; } mask[wordLength] = '\0'; // 确保字符串结束符 // 游戏初始化 printf("\nHey! Can you please save me? \n"); drawHangman(0); // 初始只画底座 printf( "\nType a letter to guess the word and save me. Here are some tips!\n" "1) The '_' below are how many letters make up the word, isn't that neat!\n" "2) The letters are case sensitive so please pick lower case or I might die\n" "3) Have fun! \n" ); int wrongGuesses = 0; int correctLetters = 0; char answer; // 游戏主循环:直到猜对所有字母或猜错次数达上限 while (wrongGuesses < 8 && correctLetters < wordLength) { printf("\nCurrent word: %s\n", mask); printf("Enter your guess: "); scanf_s(" %c", &answer); // 前面加空格跳过换行符 int isCorrect = 0; // 检查输入字母是否在单词中 for (int i = 0; i < wordLength; ++i) { if (word[x][i] == answer && mask[i] == '_') { mask[i] = answer; correctLetters++; isCorrect = 1; } } // 猜错则递增错误次数并绘制Hangman if (!isCorrect) { wrongGuesses++; drawHangman(wrongGuesses); } } // 游戏结束判断 if (correctLetters == wordLength) { printf("\nCurrent word: %s\n", mask); printf("Thanks for saving me!\n"); } else { printf("\nThe word was: %s\n", word[x]); } return 0; }
关键修改说明
- 新增
drawHangman函数,把绘制逻辑封装起来,避免冗余代码。 - 修正掩码数组为
char类型,并添加字符串结束符,确保正常输出。 - 主循环改用
while,基于"错误次数未达上限"和"未猜完所有字母"两个条件,逻辑更清晰。 - 每次循环重新读取用户输入,加入空格
" %c"跳过之前输入留下的换行符。 - 添加判断输入字母是否正确的逻辑,只有猜错时才递增计数器并绘制Hangman。
- 移除了导致程序提前终止的
return 0,让循环正常执行到游戏结束。
内容的提问来源于stack exchange,提问作者Ocelotter
相关产品推荐
相关产品推荐

