游戏要求:
- 代码运行后自动生成1~100的随机数。
2.猜大猜小都会给出反馈。
随机数生成
rand
C语言中提供了一个函数叫 rand ,可生成随机数。

rand 函数会返回一个伪随机数,这个随机数的范围是 0 ~ RAND_MAX 之间。
使用 rand 需要包含一个头文件 stdlib.h 。
在 visual studio 2026 中 RAND_MAX 值是 32767。


1 2 3 4 5
| printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand());
|

运行几次上述代码发现每次生成的随机数都一样,这不符合需求。因为 rand 函
数是伪随机,是基于一个“种子”的基准值进行运算生成的随机数。
要想让每次生成的随机数不一样,就得在每次生成前改变这个“种子”。
srand
C语言中提供了一个函数 srand , 用来初始化随机数的生成器。

在调用 rand 前先调用 srand , 只要“种子”在变化,rand 就可以达到一定程度上的
随机。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| srand(1); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand());
srand(2); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand());
srand(3); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand());
|

这里出现了一个问题,需要一个能一直在自动变化的“种子”。
time
“时间”满足了这一条件。
C语言提供了一个叫 time 的函数 , 可以获得时间。

该函数返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位
是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的
整型类型。
time函数的参数timer如果是⾮NULL的指针的话,函数也会将这个返回的差值放
在timer指向的内存中带回去。如果timer是NULL,就只返回这个时间的差值。
time函数返回的这个时间差也被叫做:时间戳。
使用 time 函数需要包含头文件 time.h。
1 2 3 4 5 6 7 8 9 10 11 12 13
| int i = 0; for (i = 1;i <= 3;i++) { srand((unsigned)time(NULL)); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("\n"); }
|

多运行几次就看到差异了。
限制生成随机数的范围
需求是从1~100之间随机生成。可以通过 % 运算符进行限制。
a % b ,得到的结果只会是 0 ~ b - 1。
对 rand 生成的数对100取模并 + 1 即可。
1 2 3 4
| srand((unsigned)time(NULL)); int num = rand() % 100 + 1; printf("%d\n", num);
|

猜数字游戏的代码实现
结合上文,先完成一个最简单的猜数字游戏的逻辑。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| srand((unsigned)time(NULL)); int rand_num = rand() % 100 + 1; printf("欢迎来到猜数字游戏!\n"); printf("我已经想好了一个1~100之间的数字,你能猜到它是什么吗?\n"); printf("请输入猜的数字:>"); int num = 0;
while (1) { scanf("%d", &num); if (num < rand_num) { printf("你猜的数字太小了!\n"); } else if (num > rand_num) { printf("你猜的数字太大了!\n"); } else { printf("恭喜你,猜对了!\n"); break; } }
|

在这个基础上进行完善。
猜数字次数限制
可以给循环设定一个条件来限制猜数字次数
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
| srand((unsigned)time(NULL)); int rand_num = rand() % 100 + 1; printf("欢迎来到猜数字游戏!\n"); printf("我已经想好了一个1~100之间的数字,你能猜到它是什么吗?\n"); printf("请输入猜的数字:>"); int num = 0; int flag = 10; while (flag) { scanf("%d", &num); if (num < rand_num) { printf("你猜的数字太小了!\n"); } else if (num > rand_num) { printf("你猜的数字太大了!\n"); } else { printf("恭喜你,猜对了!\n"); break; } flag--; printf("你还有%d次机会!\n", flag); }
|

自主选择性
增加玩家自主选择是否要进行游戏。
将循环修改的更加符合逻辑
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
| int num = 0; printf("欢迎来到猜数字游戏!\n"); int flag1 = 0; do { srand((unsigned)time(NULL)); int rand_num = rand() % 100 + 1; printf("按1开始游戏!\n"); printf("按0退出游戏!\n"); scanf("%d", &flag1); int flag2 = 10; switch (flag1) { case 1: printf("我已经想好了一个1~100之间的数字,你能猜到它是什么吗?\n"); while (flag2) { printf("请输入猜的数字:>"); scanf("%d", &num); if (num < rand_num) { printf("你猜的数字太小了!\n"); } else if (num > rand_num) { printf("你猜的数字太大了!\n"); } else { printf("恭喜你,猜对了!\n"); break; } flag2--; printf("你还有%d次机会!\n\n", flag2); } break;
case 0: printf("退出游戏!\n"); exit(0); break;
default: printf("输入错误,请重新输入!\n"); break; } } while (flag1);
|
