一个简单的猜数字游戏


前言

啦啦啦啦~学了这一个月加二十天的C语言,小桃子学会了如何做一个简单的猜数字游戏,大家跟随小桃子一起来看看吧。


`

一、游戏要求

1.1 电脑自动生成一个1~100的随机数

1.2 玩家猜数,猜数过程中给出相应的大小提示

二、功能实现

2.1 随机数生成

2 .1.1 rand函数 srand函数 time函数

C语言提供了一个rand函数,可以生成“随机数”

/*随机数的生成*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	printf("%d\n", rand());//但这样生成的“随机数”其实并不随机
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	
	return 0;
}

在这里插入图片描述
rand函数为库函数,使用时要包含<stdlib.h>这个头文件。
我们可以看见屏幕上出现了一些“随机数”,但当我们让编译器重新编译链接时,弹出来的窗口上仍然是这几个数字。那么这样生成的“随机数”本质上其实并不随机。
在这里插入图片描述
甚至我们在原有的基础上再叠加一个printf,但出来的结果前面几个数字仍然不变,更加验证了rand生成的随机数其实并不随机这一点。

为什么会这样呢?

让我们深入了解一下rand函数。

C语言提供的rand函数原型为

int rand(void)

即rand函数不接收参数,会返回一个伪随机数,范围为0~RAND_MAX之间,这个最大值不确定,是依赖编译器实现的。而生成的数据不随机的原因是,rand函数是根据一个叫“种子”的基准值生成的随机数,种子默认为一。如果要生成真正的随机数,就要想办法改变这个基准值种子。

那如何改变这个基准值呢?

C语言提供了一个初始化随机数生成器的基准值(种子)的函数——srand

void srand(unsigned int seed)

在使用rand函数之前,调用srand函数,随机改变种子(基准值)的值,rand函数再对这颗种子进行运算,就可以使得rand函数生成的值变得随机起来。
那么问题来了,如果我们有能力让基准值发生随机变化,那么我们也有能力让rand函数生成随机值。
但问题就在于,我们没有办法生成一个随机数,也就没有办法生成随机的种子。

如果随机的种子没有办法生成,那有没有办法生成有一定顺序的种子呢?

我们引入C语言中的time函数

time_t time(time_t* timer);

在程序中我们一般使用程序运行的时间作为种子,因为时间是不断变化的---->种子不断变化---->生成的伪随机数不断变化---->所以伪随机数变成了真正的随机数。
time函数返回的是1970-1-1-0:00到现在时间差值的秒数差值,为32或者64位的整数类型。这个差值也叫时间戳。timer的参数我们之后再补充,小桃子暂时还不理解书上timer这段话。
目前只要记住,如果只要time函数返回时间戳,我们就这样写

time(NULL

好啦,现在我们可以完成一个随机数的生成啦!

/*随机数的生成2.0版本*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
	srand((unsigned int)time(NULL));//将time类型强转为unsigned int类型(srand函数的参数类型)
	printf("%d\n", rand());//种子已经发生变化
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

在这里插入图片描述
在这里插入图片描述
我们可以看到,已经完成随机数的生成工作啦!

问题又来了,如何生成0~99之间的随机数呢?
利用适当的加减与取余

要生成a~b的随机数,方法如下

a + rand()%(b - a + 1);

2.2 游戏实现

/*猜数字游戏*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


void menu(void)
{
	printf("****1为玩游戏,2为不玩游戏***\n");
	printf("*****************************\n");
	printf("**********1 . play **********\n");
	printf("**********0 . exit **********\n");
	printf("*****************************\n");
}


void game()
{
	int guess = 0;
	int right = rand() % 100 + 1;
	while (1)
	{
		printf("请输入你认为正确的数字 : \n");
		scanf("%d", &guess);
		if (guess > right)
			printf("haha,你猜大了\n");
		else if (guess < right)
			printf("hehe,你猜小了\n");
		else
		{
			printf("好好好,被你小子猜着了\n");
			break;
		}
	}
}


int main(void)
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//出现1/0提示图标
		printf("请选择1 / 0 : \n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	} while (input);


	return 0;
}

执行结果
在这里插入图片描述

总结

这是小桃子写的第一个“系统”一点的“游戏”,非常简陋,或许也根本就不算一个游戏,还是在模仿老师的情况下完成的,但是小桃子依旧很开心啦~

我是小桃子,我爱这个世界。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值