游戏要求:

  1. 代码运行后自动生成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); // 设置随机数种子为1
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());

srand(2); // 设置随机数种子为2
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());

srand(3); // 设置随机数种子为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
// 通过srand()函数设置随机数种子为当前时间,可以让rand()函数返回的随机数每次运行都不同
int i = 0;
for (i = 1;i <= 3;i++)
{
// 循环三次,每次设置不同的随机数种子,看看rand()函数返回的随机数是否不同
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
// 测试生成1~100之间的随机数
srand((unsigned)time(NULL));
int num = rand() % 100 + 1; // 生成1~100之间的随机数
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; // 生成1~100之间的随机数
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; // 生成1~100之间的随机数
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; // 生成1~100之间的随机数
printf("按1开始游戏!\n");
printf("按0退出游戏!\n");
scanf("%d", &flag1); // 用户玩不玩判断
int flag2 = 10; // 玩的话有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;//防止 switch 发生穿透

case 0:
printf("退出游戏!\n");
exit(0); // 退出游戏,结束程序
break;

default:
printf("输入错误,请重新输入!\n");
break;
}
} while (flag1);