首先我们如果要写一个猜数游戏,就要先生成随机数,总不能要猜的数字由另一个人输入吧,那样就太麻烦了。
1. 随机数生成
1.1 rand函数(伪随机数)
函数原型如下:
1. int rand(void);
rand 函数会返回一个伪随机数,这个随机数值的范围是在0-RAND_MAX之间,这个RAND_MAX地大小是依赖编辑器实现的,但是大部分都是32767。rand 函数的使用需要包含一个头文件:stdlib.h。
如在VS2022中:
rand 函数无论调用几次均生成和上次生成一样的数,为了减少篇幅,这里就不再举例,读者可自行实验。
1.2 srand函数
C语言中又提供了一个函数叫 srand ,用来初始化随机数的生成器,srand 的原型如下:
1. void srand(unsigned int seed);
程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数时的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。
1.3 time函数
在程序设计中我们一般时使用程序运行的时间作为种子的,因为时间是刻在发生变化。
在C语言中有一个函数叫 time ,就可以获得这个时间,time 函数原型如下:
1. time_t time (time_t* timer);
time 函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间差值,单位是秒。返回类型是 time_t 类型的,time_t 类型本质上其实就是32位或者64位的整型类型。
time 函数的参数 timer 如果是非NULL指针的话,函数也会将这个返回的差值放在 timer 指向的内存中带回去。
如果 timer 是 NULL,就只返回这个时间的差值。time 函数返回的这个时间差也被叫做:时间戳。
time 函数调用需要包含头文件:time.h
若只让 time 函数返回时间戳,则可:
1. time(NULL)
生成随机数的代码可以如下:
1. #includ<stdio.h>
2. #include<stdlib.h>
3. #include<time.h>
4.
5. int main()
6. {
7. //使用time函数的返回值设置种子
8. //因为srand的参数是unsinged int类型,我们将time函数的返回值强制类型转换
9. srand((unsigned int)time(NULL));
10. printf("%d\n",rand());
11. printf("%d\n",rand());
12. return 0;
16. }
srand 函数不需要频繁使用,一次运行的程序中调用一次就够了。
1.4 设置随机数的范围
生成0-99之间的随机数:
1. rand() % 100;
生成1-100之间的随机数:
1. rand()%100+1;
生成a-b的随机数:
1. a+rand()%(b-a+1);
2. 猜数游戏示例代码:
1. #define _CRT_SECURE_NO_WARNINGS 1
2. #include<stdio.h>
3. #include<time.h>
4. #include<stdlib.h>
5. void game()
6. {
7. //1.生成随机数
8. int i = rand()%100+1;
9. //2.猜数字
10. int guess = 0;
11. int count = 0;
12. printf("请输入猜数字次数");
13. scanf("%d", &count);
14. while (count)
15. {
16. printf("还剩下%d次机会\n", count);
17. printf("请猜数字:>");
18. scanf("%d", &guess);
19. if (guess > i)
20. printf("猜大了\n");
21. else if (guess < i)
22. printf("猜小了\n");
23. else
24. {
25. printf("恭喜你,猜对了\n");
26. break;
27. }
28. count--;
29. }
30. if (count == 0)
31. printf("很遗憾,在规定次数内没能猜出结果");
32. }
33. void menu()//打印菜单
34. {
35. printf("*********************\n");
36. printf("****** 1. play*******\n");
37. printf("****** 0. exit*******\n");
38. printf("*********************\n");
39. }
40. int main()
41. {
42. int input = 0;
43. srand((unsigned int)time(NULL));
44. do //循环体,令游戏可重复进入
45. {
46. menu();
47. printf("请选择:>");
48. scanf("%d", &input);
49. switch (input) //选择语句,选择是否进入游戏
50. {
51. case 1:
52. game();
53. printf("猜数字游戏\n");
54. break;
55. case 0:
56. printf("退出游戏\n");
57. break;
58. default:
59. printf("选择错误,重新选择\n");
60. break;
61. }
62. } while (input);
63.
64.
65. return 0;
66. }