简单不先于复杂,而是在复杂之后。
目录
1.思路(代码会附在最后面)
2.随机数函数rand
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~100
int 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;
}