【C语言】猜数字游戏的实现
简单不先于复杂,而是在复杂之后。
目录
1.思路(代码会附在最后面)
1.思路(代码会附在最后面)
首先实现一个猜数字游戏我们先要有一个思路:
1.产生一个随机数2.猜数字
3.可能猜大了
4.可能猜小了
5.直到猜对了结束
2.随机数函数rand
想要生成一个随机数,就要用到 rand 函数。
rand 会返回一个 0 到 RAND_MAX 的整型
我们需要知道RAND_MAX是个什么样的值
把RAND_MAX转到定义如下图
0X开头的是十六进制的数字
把鼠标移到十六进制数上方换算出的结果是32767
所以我们生成随机数的范围是0~32767之间的一个值
以上是测试出生成的值
当关闭程序再次运行,我们会发现生成的随机数和上一次一模一样。
这显然不是我们想要生成的随机数,因为它并不随机。
在调用 rand 函数之前需要使用 srand 函数来设置我们的随机数生成器。
srand 函数的是作用是设置一个随机数起点。
且需要一个无符号整形的一个数值。
可是当我们用 srand 设置起点时,参数为100,生成的随机数的值全部都是 365。
这时我们发现,当 srand 中的参数变了,再次运行,生成的随机数也就改变了。
如果 srand 的参数是一个随机数,生成的数也就是随机的了。
我们为了生成一个随机数,需要一个随机数,很明显是不太现实的。
我们转换思路,参数只需要是时刻变化的数就可以,那么什么东西在时刻变化呢?
时间。
想要获取一个时间,就要引入时间戳的概念:
时间戳就是这个时间相对于计算机起始时间之间的一个差值。单位是秒。
时间在变,时间戳就在变。
使用 time 函数来获取时间戳。
time参数可以传一个空指针,time 的返回类型是 time_t, 但是 srand 参数需要一个无符号整型,所以就要强制类型转换。
转到定义看一下,空指针本质上就是0,表示我们不需要这个参数。
time 库函数需要的头文件是 #include<time.h>
srand 库函数需要的头文件是 #include<stdlib.h>
不是每一次生成随机数都要设置一个起点,所以 srand 函数就不必放在 game 函数中,在主函数中设置一次就可以了。
如果每次生成都设置,就会发现,如果开两次生成随机数时间过短,有可能生成的随机数相同。可以自己试一下。
现在我们已经可以生成足够随机的数了,但是我们想让这个数的生成范围是1~100
因为 rand 函数的生成范围是0~32767,所以这样处理:
rand()%100+1
范围就在1~100之间了。
下附代码:
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//电脑产生一个随机数(1 ~ 100)
//猜数字
//猜大了
//猜小了
//直到猜对了结束void menu()
{printf("##\\n");printf("## 1.play #\\n");printf("##\\n");printf("## 0.exit #\\n");printf("##\\n");
}//生成的随机数范围 0 ~ RAND_MAX(32767)
void game(){int guess = 0;//time 函数返回 time_t(时间戳),用于获取系统时间。需要一个指针参数,如果不需要使用参数,传一个空指针。//time_t 为一个数据类型 - 整型//RAND_MAX;//在调用 rand 函数之前要使用 srand 来设置随机数生成器//srand : 设置一个随机的起点//1.生成随机数]//0~99 ----> 1~100int ret = rand() % 100 + 1;//生成随机数的函数,返回一个随机的整数//2.猜数字while (1){printf("请猜数字:>");scanf("%d", &guess);if (guess < ret){printf("猜小了\\n");}else if (guess > ret){printf("猜大了\\n");}else{printf("恭喜你,猜对了!\\n");break;}}}//指针
//int *p = NULL; - 初始化空指针,本质是0
int main()
{srand((unsigned int)time(NULL));//不是每次生成随机数时都要设置一个起点,设置一次就就可以int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();//猜数字的整个逻辑break;case 0:printf("退出游戏\\n");break;default:printf("选择错误,重新选择!\\n");break;}} while (input);return 0;
}