C语言Hangman猜词游戏掩码实现问题及输出错误求助
解决Hangman游戏的掩码问题及逻辑关联
一、先修复掩码输出的报错问题
你用printf("%s", mask[i])触发错误的核心是类型不匹配:
mask[i]是单个char类型的字符(比如掩码里的某一个_)- 而
printf的%s格式符要求传入的是字符串的首地址(char*)
两种修复方案:
- 输出整个掩码字符串:直接用
printf("%s\n", mask);(前提是mask已正确初始化并以'\0'结尾) - 逐个输出掩码字符:用
printf("%c ", mask[i]);遍历每个字符
二、掩码与猜词循环、计数器的关联逻辑
核心是把掩码作为游戏状态的核心载体,每次猜字母后更新掩码,同时联动计数器判断游戏走向:
关键步骤拆解
初始化掩码:
根据选中的目标单词长度,创建同长度的char数组,所有元素设为_,最后必须加字符串结束符'\0'。比如目标单词是apple,掩码初始化为_____。循环控制条件:
循环继续的条件是「剩余猜测次数 > 0」且「掩码还没完全匹配目标单词」。猜字母后的处理逻辑:
- 初始化
int found = 0;标记本次猜测是否命中 - 遍历目标单词的每个字符,若和用户输入的字母匹配:
- 更新掩码对应位置的字符为该字母
- 把
found设为1,表示猜对了
- 如果
found为0(没猜对),剩余猜测次数减1
- 初始化
游戏结束判断:
- 每次循环后检查掩码和目标单词是否完全一致:一致则用户获胜,跳出循环
- 如果剩余猜测次数减到0,用户失败,跳出循环
三、修正后的完整示例代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> int main() { // 固定单词列表 char *words[] = {"apple", "banana", "orange", "grape", "mango"}; int word_count = sizeof(words) / sizeof(words[0]); // 随机选单词 srand(time(NULL)); char *target_word = words[rand() % word_count]; int word_len = strlen(target_word); // 初始化掩码 char mask[20]; // 假设单词最长不超过19个字符 for (int i = 0; i < word_len; i++) { mask[i] = '_'; } mask[word_len] = '\0'; // 必须加字符串结束符 int max_tries = 6; // 最多猜错次数,对应Hangman的身体部位 int remaining_tries = max_tries; // 猜词循环 while (remaining_tries > 0 && strcmp(mask, target_word) != 0) { printf("\n当前掩码: %s\n", mask); printf("剩余猜测次数: %d\n", remaining_tries); printf("请输入一个字母: "); char guess; scanf(" %c", &guess); // 空格跳过换行符等空白字符 int found = 0; // 遍历目标单词,更新掩码 for (int i = 0; i < word_len; i++) { if (target_word[i] == guess) { mask[i] = guess; found = 1; } } if (!found) { remaining_tries--; printf("猜错了!这个字母不在单词里。\n"); } else { printf("猜对了!\n"); } } // 游戏结束结果 if (strcmp(mask, target_word) == 0) { printf("\n恭喜你猜对了!单词是: %s\n", target_word); } else { printf("\n游戏结束!正确单词是: %s\n", target_word); } return 0; }
内容的提问来源于stack exchange,提问作者Ocelotter
相关产品推荐
相关产品推荐

