☰
C 语言猜数字游戏(Visual Studio 实现):从菜单循环到 scanf 防死循环
2026/10/27 8:36:27 网站建设 项目流程

C 语言猜数字游戏(Visual Studio 实现):从菜单循环到 scanf 防死循环

源码仓库:https://gitee.com/cheng-zhemyj/personal-warehouse (猜数字游戏/目录,Visual Studio 工程)

一、思路

经典入门小项目,核心是三块:

  1. 菜单 + do-while 循环:至少玩一次,选 0 退出;
  2. 游戏逻辑:rand() % 100 + 1生成 1~100 随机数,循环里比大小;
  3. 输入容错:scanf返回值判断是否成功读入数字,失败就清空缓冲区重输——这是新手最容易踩的坑(输入字母导致死循环)。

二、完整代码

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>voidgame(){intr=rand()%100+1;intguess=0;while(1){printf("请猜数字(1~100)>:");// 输入的不是数字时,清空缓冲区并重新输入,防止死循环if(scanf("%d",&guess)!=1){while(getchar()!='\n');printf("输入错误,请输入数字\n");continue;}if(guess<r)printf("猜小了\n");elseif(guess>r)printf("猜大了\n");else{printf("恭喜你,猜对了\n");break;}}}voidmenu(){printf("***********************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("***********************\n");}intmain(){intinput=0;srand((unsignedint)time(NULL));do{menu();printf("请选择:>");// 同样防止菜单选错输入字母时死循环if(scanf("%d",&input)!=1){while(getchar()!='\n');printf("选择错误,重新选择\n");continue;}switch(input){case1:game();break;case0:printf("游戏结束\n");break;default:printf("选择错误,重新选择\n");break;}}while(input);return0;}

三、几个关键点

1.srand((unsigned int)time(NULL))

随机数种子只播一次就够。放在game()里每次都播,同一秒内连续开局会拿到相同的"随机数"。

2.scanf返回值是成功读到的项数

读%d时输入了字母,返回 0,而那个字母还留在输入缓冲区里。如果不清掉,下一轮scanf又读到它,无限循环。所以标准处理是:

if(scanf("%d",&x)!=1){while(getchar()!='\n');// 清空一行缓冲continue;}

3.do-while配合菜单

菜单类交互天然适合do-while:先显示菜单再判断要不要退出,比while少一次前置判断。

四、运行效果

*********************** ****** 1. play ****** ****** 0. exit ****** *********************** 请选择:>1 请猜数字(1~100)>:50 猜大了 请猜数字(1~100)>:abc 输入错误,请输入数字 请猜数字(1~100)>:25 恭喜你,猜对了

五、可以继续扩展的方向

  • 限制猜测次数(比如 7 次内猜中,二分法理论上 log2(100) ≈ 7)
  • 猜对后显示用了几次
  • 二分法"电脑猜人"版本(反过来让程序猜你心里想的数)

*本人嵌入式方向在学 STM32,仓库里还有流水灯等工程,欢迎交流。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询