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:末尾感谢语无法输出的修复
问题原因
- 玩家答错选择不继续游戏时,代码直接调用
return结束程序,没有执行到末尾的printf语句 - 当玩家累计答对19次以上时,所有if分支都不满足匹配条件,程序进入空转死循环,永远无法走到结束逻辑
- 部分环境下标准输出行缓冲未及时刷新,也可能导致打印内容不显示
修复方案
- 将答错后退出分支的
return改为break,统一跳出do-while循环后执行结束逻辑 - 增加最高关卡判断,达到通关条件后主动跳出循环
- 必要时可在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
相关产品推荐
相关产品推荐

