小游戏系列——猜数字游戏

【声明】:这里博主推出一个小游戏给铁汁们,用来增强铁汁们学习C语言的热情,真的很简单哦,快来康康吧。

猜数字小游戏

注意,由于这篇是为了刚入门计算机专业的铁汁们准备的目的是增加大家对于学习编程的热情,所以就没有按照项目工程那样分为声明、定义、测试模块,笔者在这里就直接写在测试一栏里了。不要给自己设限,当自己实现出来的时候,你会发现真的很简单,和笔者一起加油哦。

描述:电脑随机生成一个1~100之间的数字,要求玩家去猜数字。

  • 玩家猜小了,电脑会告诉,猜小了;
  • 玩家猜大了,电脑会告诉,猜大了;
  • 玩家猜中了,电脑会告诉,恭喜你,猜对了

下面,我先把这个游戏的大致逻辑给写出来,帮助大家更好的上手。

#include<stdio.h>

//菜单
void menu()
{
	printf("*****************************\n");
	printf("*****      1.play       *****\n");
	printf("*****      0.exit       *****\n");
	printf("*****************************\n");
}
int main()
{
	int input = 0;

	//用do...while语句更合适一些,因为程序刚执行就要把菜单打印出来
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("猜数字\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

其实逻辑很简单,下面只要把

printf("猜数字\n");

封装成一个函数,用来实现猜数字的功能就行啦。

此时执行代码是这样的:

是不是看起来很简单,下面我将猜数字的过程给实现出来,那么这个小游戏就完成啦。

//实现猜数字过程
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
	printf("*****************************\n");
	printf("*****      1.play       *****\n");
	printf("*****      0.exit       *****\n");
	printf("*****************************\n");
}

void game()
{
	//猜数字游戏的过程
	int guess = 0;

	//0~32767之间的范围太大了,本题要的是1~100之间即可
	int r = rand() % 100 + 1;//1~100      rand() % 100 -> 0~99
	
	//猜数字
	while (1)
	{
		printf("猜数字:>");
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小了\n");
		}
		else if (guess > r)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
	
}
int main()
{
	int input = 0;
	//设置随机数的生成器,整个程序只要设置一次就可以了所以不要放在前面函数定义里面
	srand((unsigned int)time(NULL));//但是生成的随机数需要时时在变化,所以传入的是时间戳
	
	//用do...while语句更合适一些,因为我们一上来就要打印菜单
	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;
}

好,我知道铁汁可能对于上面的有些代码不是很理解,没关系的,我来了。

 你可能不理解为什么多了两个头文件:

#include<stdlib.h>
#include<time.h>

添加stdlib.h头文件,是因为使用了库函数 rand() 和 srand() ,而添加time.h头文件,是因为使用库函数time(), 而添加stdio.h头文件,不用我说大家都知道,是因为使用了库函数printf() 和 scanf()

说到这里,我自己都忍不住问自己为啥要使用库函数rand() ,srand() 和 time()?别急, 请朝后看:

首先,这个游戏的操作重点在于电脑处理生成随机数这块内容,那么C语言中生成随机数的方法是什么呢?嘿嘿,这里就要提到库函数 rand() 了。

rand() 函数原型:

哈哈,没错这是英文文档,其实也能找到很多中文版本的,但是大家要学习着看英文文档哦,毕竟以后进入公司,很多专业文档他喵的几乎都是英文的,谁叫咱们这方面没有老外起步早呢,不过没关系,后来者居上,大家一起努力,若干年之后,咱们中文势必成为真正的国际通用!!!

有点跑题了,回来回来...

从红方括号括起来的内容不难看出,rand()生成随机数的范围是0~RAND_MAX之间的数字,而RAND_MAX大小是0x7fff ,这是十六进制表示形式,转换成十进制就是32767,所以rand()生成随机数的范围就是0~32767

可能你在疑问,为什么RAND_MAX大小是0x7fff ,不是别的呢,哈哈,笔者当然是有根据的,先在编译器上将它打出来 

然后点击鼠标右键,会显示:

此时只需要点一下“转到定义”, 就能看到咱们想要的啦。

问:下面代码是啥意思? 

int r = rand() % 100 + 1;

 解释:

    //0~32767之间的范围太大了,本题要的是1~100之间即可
	//rand() % 100 == 0 ~ 99
    //rand() % 100 + 1 == 1~100  

    //所以才写成下面的形式
    int r = rand() % 100 + 1;

好,说到这里,红色方框里面的内容就解释的差不多了 ,现在来看蓝色方框里面的内容。

蓝色方框主要讲的是,在使用rand()函数之前,需要先设置随机数的生成器,想想也是啊,没有随

 机数的生成器,怎么会生成随机数呢!

 这该死的逻辑

那这里就要讲解一下库函数srand() 了

srand() 函数原型:

srand()函数里面需要传入一个不断变化的值 ,才能让rand()函数生成随机数,如果传入的是常数的话,那么每次生成的随机数都会是同一个数,那什么值是不断变化的呢,当然是时间啦。

 那程序里面写了这么一大坨是啥意思?

srand((unsigned int)time(NULL));

如果想要把这个讲解清楚,首先讲一下库函数time()

那为什么要引入time()函数呢?

这里补充一下“时间戳”的概念:何为时间戳?

任何一个时间都能转化成一个时间戳,时间是在不断变化的,所以时间戳也是不断变化的,而获取时间戳,需要调用time()函数

time()函数原型:

time() 函数里面参数的数据类型是指针型,所以传入一个NULL(空指针)进去,变成time(NULL)

这里大家先别刨根问底问为什么传进去的是空指针而不是别的,因为这里涉及的知识比较多,等到零基础搞定C语言系列更新到指针那块内容,笔者会灰常详细的介绍哦,在这里大家只要知道time()函数里面的参数类型是指针型,此题传入的是空指针就行啦。

因为time()函数的返回值类型是time_t类型,但是srand()函数参数类型是unsigned int 型,所以要进行强制类型转换

srand((unsigned int)time(NULL));

还有还有,为什么srand()函数不直接写在rand()函数的前面,而是放在主函数中?

那是因为啊,设置随机数的生成器,整个程序只要设置一次就可以了,如果放在game()中,那么调用一次函数就会设置一个随机数的生成器,所以才放在主函数中。

好咯,这个小游戏就这么多内容了,确实很简单,后面笔者还会更新一些小游戏哦,觉得有所收获的铁汁们可以动动小手,给笔者来个三连。

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安然无虞

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值