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

C语言数字记忆游戏if分支多执行1次及printf不执行问题咨询

数字记忆小游戏问题修复与优化方案

问题1:第一关需答对4次才晋级的修复

问题原因

第一关的判断条件为if(good >= 0 && good <=3),覆盖了good=0、1、2、3共4个取值,对应需要连续答对4次才会进入下一关。其余关卡的判断逻辑(如good>3 && good<7)刚好覆盖3个取值,符合3次答对晋级的设计要求,所以仅第一关出现异常。
同时额外注意:代码中每次循环都调用srand(time(NULL))是错误用法,srand只需在程序启动时调用一次初始化随机种子即可,循环内重复调用会因time返回秒级时间戳,导致短时间内生成的随机数重复。

修复方案

将第一关的判断条件修改为if(good >= 0 && good < 3)即可,同时把srand(time(NULL))移到main函数最开头,循环内不再调用。


问题2:末尾感谢语无法输出的修复

问题原因

  1. 玩家答错选择不继续游戏时,代码直接调用return结束程序,没有执行到末尾的printf语句
  2. 当玩家累计答对19次以上时,所有if分支都不满足匹配条件,程序进入空转死循环,永远无法走到结束逻辑
  3. 部分环境下标准输出行缓冲未及时刷新,也可能导致打印内容不显示

修复方案

  1. 将答错后退出分支的return改为break,统一跳出do-while循环后执行结束逻辑
  2. 增加最高关卡判断,达到通关条件后主动跳出循环
  3. 必要时可在printf后添加fflush(stdout)强制刷新输出缓冲

问题3:重复if分支逻辑优化

优化思路

通过答对次数直接计算当前关卡等级,动态生成对应位数的数值上下限,完全消除重复分支代码:

  • 关卡等级计算:int level = good / 3; 每答对3次等级自动+1
  • 数值上下限计算:N位数字的下限为pow(10, N-1)(1位数字特判下限为0),上限为pow(10, N) -1
  • 所有重复的出题、答题、对错判断逻辑全部复用,无需为每个等级单独写分支

优化后完整可运行代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
    int random_digits;
    int response;
    int good = 0;
    char a;
    const int MAX_LEVEL = 6; // 最高支持6位数字,可自行调整

    // 随机种子只需初始化一次
    srand(time(NULL));

    do{
        int level = good / 3;
        // 达到最高等级后通关退出
        if(level >= MAX_LEVEL){
            printf("恭喜你通关全部关卡!\n");
            break;
        }

        int lower, upper;
        if(level == 0){
            lower = 0;
            upper = 9;
        }else{
            lower = pow(10, level);
            upper = pow(10, level+1) - 1;
        }

        // 出题逻辑
        int number = (rand() % (upper - lower + 1)) + lower;
        printf("%d", number);
        random_digits = number;
        sleep(1);
        printf("\rEnter the number please :");
        scanf("%d", &response);

        // 对错判断逻辑
        if(response == random_digits){
            good++;
        }else{
            printf("Do You Want to Play Again?Y/N:");
            scanf(" %c", &a);
            if (a == 'Y' || a == 'y'){
                good = 0;
            }else{
                break; // 跳出循环走统一结束逻辑
            }
        }

    }while(response == random_digits);

    printf("Thanks for playing!\n");
    fflush(stdout); // 强制刷新输出确保内容显示
    sleep(2);
    return 0;
}

注:编译时需添加-lm参数链接数学库,例如编译命令为 gcc game.c -o game -lm

内容的提问来源于stack exchange,提问作者Mister-3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:06:08