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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:06:18