C 语言猜数字游戏(Visual Studio 实现):从菜单循环到 scanf 防死循环
源码仓库:https://gitee.com/cheng-zhemyj/personal-warehouse (
猜数字游戏/目录,Visual Studio 工程)
一、思路
经典入门小项目,核心是三块:
- 菜单 + do-while 循环:至少玩一次,选 0 退出;
- 游戏逻辑:
rand() % 100 + 1生成 1~100 随机数,循环里比大小; - 输入容错:
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,仓库里还有流水灯等工程,欢迎交流。