3.0、C语言——猜数字游戏

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值