3.0、C语言——猜数字游戏
首先来说一下随机数生成的方式:
库函数 rand() 可以帮助我们生产一个随机数字,但是在使用 rand() 函数之前需要用 srand() 函数去设置一个随机起点
【注意:这里如果不用 srand() 函数去设置起点的话,那么每轮 rand() 函数生成的随机数都是一样的,比如 -> 第一轮生成的5个随机数:1、2、3、4、5
第二轮生成的5个随机数:1、2、3、4、5
第三轮生成的5个随机数:1、2、3、4、5】
这个随机起点的参数类型是unsigned int,也就是说要给 srand() 函数一个随机的整型值来作为 rand() 函数的起点才可以,但是我们本来不就是要生成一个随机数么?现在又需要一个随机数起点才能生成另一个随机数,那不是死循环了么...
这时候我们想到了解决方案 -> 时间戳,先简单解释一下什么是时间戳?
时间戳 指的就是从 1970 年 1 月 1 日 0 时 0 点 0 分 开始算起,一直到当前时间的总秒数,这段数字就是时间戳,由于时间在不断的前进,所以时间戳也在不断的改变,
这里再顺便说一下 由于以前的计算机操作系统只有 32位 所以时间戳最多间隔时间只能表示 68年,那么也就是说到了2038 便会达到最大时间,过了这个时间点所有的 32位 操作系统就会出现时间回归的现象 ->也就是全部重置为 10000000 00000000 00000000 00000000 很多软件就会出现异常了,
时间回归现象的问题 随着 64位 操作系统的诞生得到了解决,因为64位操作系统可以表示到292,277,026,596年,这个时间在千亿年之后了~
获取时间戳:
库函数 time() 会返回系统的时间也就是时间戳【使用的时候记得引入头文件 #include <time.h>】,查看原码可知 time() 函数返回的类型是一个 time_t 类型,而 time_t 类型其实是被 typedef 重命名了,查看原码可知原来的类型就是 long 长整型;然后 time() 函数还需要一个 指针变量 ,这里可以给他一个 NULL 空指针即可~
而我们的 srand() 函数需要的参数就是一个 整型参数,那么刚好将 time() 返回的时间戳放到srand() 函数中再将类型 强制转换为 unsigned int 即可,代码如下:
srand((unsigned int)time(NULL));
int random = rand() % 100 + 1; //这里 %100 + 1 指的是随机生产1~100之间的数字
完整代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void menu() {
printf("************************************** \n");
printf("******* 1.play 0.exit ******* \n");
printf("************************************** \n");
}
int game() {
int random = rand() % 100 + 1;
printf("猜数字游戏开始~ 请输入数字~ \n");
int g = 0;
int i = 0;
for (i = 0; i < 3;i++) {
while (getchar() != '\n') {
;
}
scanf("%d", &g);
if (g > random) {
printf("大了~ 还剩下%d次机会 \n",2-i);
}
else if (g < random) {
printf("小了~ 还剩下%d次机会 \n",2-i);
}
else if (g == random) {
printf("恭喜猜对了~游戏结束 \n");
break;
}
}
if (i == 3) {
printf("三次机会用完了~游戏结束 \n");
}
}
int main() {
srand((unsigned int)time(NULL));
int flag;
do {
menu();
printf("请选择> \n");
scanf("%d",&flag);
switch(flag) {
case 1:
game();
break;
case 0:
printf("游戏结束~ \n");
break;
default:
printf("只能输入 1 或 0 \n");
}
} while (flag != 0);
return 0;
}