C语言分支循环进阶:随机数与猜数字游戏
1. 项目目标
程序随机生成一个 1~100 的整数,玩家反复输入猜测值。程序根据输入提示“猜大了”或“猜小了”,直到猜中为止。
这个小游戏综合使用:
if/else 条件判断;
while、do...while 循环;
switch 菜单分支;
rand、srand 和 time;
- 函数拆分与输入校验。
2. 随机数函数
2.1 rand
rand() 声明在 <stdlib.h> 中,返回 0~RAND_MAX 范围内的伪随机整数。
1 2 3 4 5 6 7 8
| #include <stdio.h> #include <stdlib.h>
int main(void) { printf("%d\n", rand()); return 0; }
|
伪随机数由算法计算得到。如果不设置随机种子,程序每次启动往往会产生相同序列。
2.2 srand 与 time
srand() 用来设置随机种子,通常把不断变化的时间戳作为种子:
1 2 3 4
| #include <stdlib.h> #include <time.h>
srand((unsigned int)time(NULL));
|
注意:srand 在程序启动时调用一次即可,不要每生成一个随机数就重新设置种子。
2.3 控制随机数范围
生成 1~100:
1
| int value = rand() % 100 + 1;
|
生成 [min, max]:
1
| int value = rand() % (max - min + 1) + min;
|
这种取模方法适合小游戏,但并非严格均匀分布,不应直接用于密码学或安全场景。
3. 完整实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include <stdio.h> #include <stdlib.h> #include <time.h>
void menu(void) { printf("************************\n"); printf("**** 1. play ****\n"); printf("**** 0. exit ****\n"); printf("************************\n"); }
void game(void) { int target = rand() % 100 + 1; int guess = 0;
while (1) { printf("请输入1~100之间的数字:"); if (scanf("%d", &guess) != 1) { int ch; while ((ch = getchar()) != '\n' && ch != EOF) ; printf("输入无效,请输入整数。\n"); continue; }
if (guess > target) printf("猜大了。\n"); else if (guess < target) printf("猜小了。\n"); else { printf("恭喜,猜对了!\n"); break; } } }
int main(void) { int input = 0; srand((unsigned int)time(NULL));
do { menu(); printf("请选择:"); if (scanf("%d", &input) != 1) return 1;
switch (input) { case 1: game(); break; case 0: printf("退出游戏。\n"); break; default: printf("选择错误,请重新输入。\n"); break; } } while (input != 0);
return 0; }
|
4. 易错点
- 忘记包含
<stdlib.h> 或 <time.h>。
- 在循环内部反复调用
srand(time(NULL)),短时间内种子相同。
- 写成
rand() % 100,其范围其实是 0~99。
scanf 输入失败后不清理输入缓冲区,导致死循环。
- 把菜单循环写成
while (input),初始值处理不当。
5. 总结
猜数字项目的重点不在随机算法本身,而在于把条件、循环、菜单和函数组织成一个完整程序。掌握这一结构后,可进一步增加次数限制、难度选择、历史最好成绩等功能。


Lichermione
天行健,君子以自强不息;
地势坤,君子以厚德载物。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LichermioneX 的博客!