C语言分支循环进阶:随机数与猜数字游戏

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. 易错点

  1. 忘记包含 <stdlib.h> 或 <time.h>。
  2. 在循环内部反复调用 srand(time(NULL)),短时间内种子相同。
  3. 写成 rand() % 100,其范围其实是 0~99。
  4. scanf 输入失败后不清理输入缓冲区,导致死循环。
  5. 把菜单循环写成 while (input),初始值处理不当。

5. 总结

猜数字项目的重点不在随机算法本身,而在于把条件、循环、菜单和函数组织成一个完整程序。掌握这一结构后,可进一步增加次数限制、难度选择、历史最好成绩等功能。