【C语言小游戏】猜数字游戏

hello,csdn的小伙伴呢,在前面,我们已经初步了解了c语言,并且系统的学习了分支与循环的内容。今天我们就将分支与循环的内容综合应用一下,来做一个很简单猜数字小游戏。


目录

程序的需求以及最终代码展示

一、实现打印出菜单

二、循环的条件

三、实现选择分支

四、实现具体的游戏功能

1.生成随机数

2.猜数字

总结


程序的需求以及最终代码展示

这个是最重要的一步,我们得先直到程序需要有什么需求,才能方便我们进行后面的操作

1.程序会声称1~100之间的随机数

2.猜数字

(1)猜小了,程序提示猜小了,继续猜

(2)猜大了,程序提示猜大了,继续猜

(3)猜中了,程序提示猜中了,游戏结束

3.游戏可以反复玩

这里直接给出最终代码展示,读者可以先自行阅读,然后看文章的讲解是如何实现出这个代码的。

#include
#include
#include
void menu()
{
	printf("*************************\n");
	printf("*****  1.开始游戏   *****\n");
	printf("*****  0.结束游戏   *****\n");
	printf("*************************\n");
}
void play()
{
	int ret = rand()%100+1;
	int num;
	//printf("%d\n", ret);
	printf("请输入你猜的数字\n");
	while(1)
	{
		scanf("%d", &num);
		if (num > ret)
		{
			printf("猜大了,请重新选择\n");
		}
		else if (num < ret)
		{
			printf("猜小了,请重新选择\n");
		}
		else
		{
			printf("恭喜你,猜对了!!!");
		}
	}
}
int main()
{ 
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			play();
			printf("开始猜数字\n");
			break;
		case 0:
			printf("结束游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

一、实现打印出菜单

首先我们得打印出一个菜单吧,菜单上面显示着开始游戏或者退出游戏。如何实现呢?请看下面代码。

#include
void menu()
{
	printf("*************************\n");
	printf("*****  1.开始游戏   *****\n");
	printf("*****  0.结束游戏   *****\n");
	printf("*************************\n");
}
int main()
{
	do
	{
		menu();
		printf("请选择:");
	} while ();
	return 0;
}

如上代码所示,我们进入主函数以后,先执行一个do while循环,因为我们这个是至少要经历一次循环的,至于循环的条件是什么,后面在探讨,然后我们将菜单封装成一个函数menu,这样的好处是可以使得主函数的代码变得简洁,使得每个功能都独立起来。方便后续的使用。这样我们就成功的制作出了一个界面了

二、循环的条件

因为这个游戏是由我们来进行选择0或者1的,所以我们肯定得需要输入一个数,这时候就需要scanf这个库函数了,我们不妨定义一个新变量input,将scanf输入的那个数字放在一个input的变量里面,注意,这里有一个经典的错误标准的零分,我们很多人在定义input的时候将input定义在了do while循环内部,这就犯了大错了,因为input是一个局部变量,它的作用域与生命周期都只在它所在的大括号内部。如果我们将input定义在了循环内部,那么我们while后面的括号就不认识input了,因为它已经离开了它所在的作用域,它的生命周期也已经销毁了。那么在这里有人就问,如果我加上一个static呢?注意,这又是一个经典的错误标准的零分,因为static对于局部变量只能延长它的生命周期,但是不会影响它的作用域,因此,加上static仍然是一个经典的错误标准的零分。

input的定义好了,那么判断条件到底是什么呢,注意看,我们的菜单是1开始游戏,0结束游戏,也就是说,判断条件就是input!=0,只要input等于0,那么循环结束,也就意味着游戏结束,可是input不等于,那是不是就等价于,我们循环的条件直接填写input就可以了,因为只有0为假,非零为真。经过思考,相信读者也能想明白。

那么我们加上循环条件后代码如下

#include
void menu()
{
	printf("*************************\n");
	printf("*****  1.开始游戏   *****\n");
	printf("*****  0.结束游戏   *****\n");
	printf("*************************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
	} while (input);
	return 0;
}

我们简单测试一下,这里也同样提醒大家,一定要完成一点需求,测试一点,防止我们后续一股劲写完后,一堆bug,无从下手。

【C语言小游戏】猜数字游戏_第1张图片

 在这里虽然说我们的游戏还没有成功制作好,但是我们的界面已经完成了。

三、实现选择分支

这个需求我们主要是用来实现如果选择这个,则需要进入哪一个环节。选择的不是0和1,又该何去何从呢?经过思考,显然switch比较适合一些,因为它比较简洁,而且其拥有一个default语句。实在是再适合不过了。那么我们来简单的实现一下吧

#include
void menu()
{
	printf("*************************\n");
	printf("*****  1.开始游戏   *****\n");
	printf("*****  0.结束游戏   *****\n");
	printf("*************************\n");
}
int main()
{ 
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始猜数字\n");
			break;
		case 0:
			printf("结束游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

我们继续测试一下功能

【C语言小游戏】猜数字游戏_第2张图片

可见符合我们的预期。

四、实现具体的游戏功能

要实现游戏功能,那肯定得把游戏的代码放在case为1的条件下,但是如果直接放进去,显得代码过于冗杂,所以我们不妨和一开始的菜单一样,将他封装到函数里面。在这个函数里面实现具体的功能,我们不妨让这个函数为 void game(),不需要参数,也不许返回任何一个东西,只要直接调用这个函数,就可以直接进行游戏。

那么游戏内部的功能该如何实现呢?

我们将其分为两步:第一步生成随机数,第二步猜数字。

1.生成随机数

如何生成随机数才是这个道题最大的难关。在这里我们需要了解一个函数rand,rand函数是专门用来生成随机数的。那么rand该怎么用呢?,我们再次打开我们的cplusplus网站查找这个库函数。在这里我们再次贴出这个网站 :c语言库函数,在这个网站中,我们搜索rand,遇到以下界面

【C语言小游戏】猜数字游戏_第3张图片

我们可以从这个网站的介绍中得知,rand是一个无参数的,返回类型是int的函数,它的作用是生成一个随机数。并且返回这个0~RAND_MAX之间的一个整数。那这里我们要了解RAND_MAX是什么东西?

我们直接把它复制粘贴到我们的visual stdio编译器上,注意要放到一个函数里面,然后我们右击它,点击转到定义。如下图所示

【C语言小游戏】猜数字游戏_第4张图片

 我们会进入到这样一个界面

【C语言小游戏】猜数字游戏_第5张图片

 在前面的学习中我们也了解到了define这个预处理指令的作用是什么(如果已经忘记了的话,我这里直接给出链接:第一站:初识C语言(第四幕))RAND_MAX其实就是我们的0x7fff这个十六进制数,这个十六进制数的大小我们也可以简单的计算一下它的十进制数也就是32767(如果想要知道计算原理的话,也在前面的文章中已经讲到,这里给出链接:进制转换)也就是说,我们 这个rand可以生成一个0~32767之间的数字。那我们不妨在程序里面进行执行以下看看效果如何?

#include
#include
void menu()
{
	printf("*************************\n");
	printf("*****  1.开始游戏   *****\n");
	printf("*****  0.结束游戏   *****\n");
	printf("*************************\n");
}
void play()
{
	int ret = rand();
	printf("%d\n", ret);
}
int main()
{ 
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			play();
			printf("开始猜数字\n");
			break;
		case 0:
			printf("结束游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

我们运行一下

【C语言小游戏】猜数字游戏_第6张图片

一眼看过去,貌似还不错啊,但是事情真的那么简单吗?,读者可以多次运行以上的代码,会发现一个很诡异的事情,那就是我每次生成的随机数都一模一样啊,这可如何是好啊。那这样我玩这个游戏玩一把就腻了啊。所以说,我们要解决这种情况。

我们继续回到那个网站,在研究一下,我们会发现中间有句话已经说到了,调用rand之前,需要使用srand函数,也就是说rand函数使用之前要使用srand函数来设置随机数的生成器,通俗的来说就是使用rand之前必须使用srand。那srand该如何用呢?我们继续使用cplusplus网站,来搜素srand

【C语言小游戏】猜数字游戏_第7张图片

我们经过阅读以后得知,srand要传入一个无符号整型的数字,不返回任何值。它的作用是设置随机数的初始值。我们可以实践一下

【C语言小游戏】猜数字游戏_第8张图片

 嗯?怎么都是38,我把这个0换成1试试?

【C语言小游戏】猜数字游戏_第9张图片

都是41,那2呢?

【C语言小游戏】猜数字游戏_第10张图片

 都是45。

这似乎是让我们传一个变化的值啊,那这疯了,我们想要一个变化的值,然后需要使用srand,结果我srand也需要传一个变化的值。陷入了死循环了啊。那该如何解决呢?实际上我们不一定要传一个随机值,我们只要传一个一直变化的值即可。其实我们生活中就有一个一直在变化的值,也就是时间。

 在这里我们就得提及一个东西了,那就是时间戳。我们在百度上搜素一下它的定义吧

 时间戳  这是我们的链接。

【C语言小游戏】猜数字游戏_第11张图片

根据上面的定义可知,时间戳就是我们当前的时间与1970年1月1日时间的差值的秒数,单位是秒。那这可就知道了,因为我们的时间一直在变化,所以这个时间戳刚好符合我们的要求啊。于是我们就将时间戳传入进去。

时间戳怎么传入呢?我们有一个函数time()这个函数用于生成时间戳,他的返回值为int,注意time_t其实就是int,但是它有一个参数,这里我们就默认传一个NULL也就是空指针,这里我们暂时不做深入讨论,读者仅仅需要记住在此处传一个NULL即可,其实NULL就是0。而且time函数属于这个头文件

【C语言小游戏】猜数字游戏_第12张图片

 所以我们的代码实现就为 (注意:srand需要传入一个unsigned int的数,而time返回的是int类型,所以下面代码就对time进行了强制类型转化)

#include
#include
#include
void menu()
{
	printf("*************************\n");
	printf("*****  1.开始游戏   *****\n");
	printf("*****  0.结束游戏   *****\n");
	printf("*************************\n");
}
void play()
{
	srand((unsigned int)time(NULL));
	int ret = rand();
	printf("%d\n", ret);
}
int main()
{ 
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			play();
			printf("开始猜数字\n");
			break;
		case 0:
			printf("结束游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

经过测试后,我们发现,貌似好像还是有点问题,因为我们每个随机数都比较相近,而且如果按的快的话,甚至都会一样

【C语言小游戏】猜数字游戏_第13张图片

 这又是什么原因呢?

其实我们的srand是初始化随机数发生器,我们只需要调用一次即可,不要频繁调用。而我们把它放到game函数后,它每玩一次游戏就会初识化一次,所以说我们把这个srand放到main函数就能解决问题.

#include
#include
#include
void menu()
{
	printf("*************************\n");
	printf("*****  1.开始游戏   *****\n");
	printf("*****  0.结束游戏   *****\n");
	printf("*************************\n");
}
void play()
{
	int ret = rand();
	printf("%d\n", ret);
}
int main()
{ 
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			play();
			printf("开始猜数字\n");
			break;
		case 0:
			printf("结束游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

运行结果如下

【C语言小游戏】猜数字游戏_第14张图片

这下事情就完美的解决了。 终于生成一个随机数了,但是我们要注意一点,我们的要获取一个1~100之间的数。所以我们要对rand对100取模+1,这样就完美的解决了问题。

【C语言小游戏】猜数字游戏_第15张图片

 现在我们已经成功的生成了随机数了,接下来我们就是进行猜数字了。

2.猜数字

这个的实现就比较简单了,我将最终代码放在这块,读者可以自行去阅读,尝试理解,有任何不懂的直接在评论区里发出来你的困惑,我看到随时回答。

#include
#include
#include
void menu()
{
	printf("*************************\n");
	printf("*****  1.开始游戏   *****\n");
	printf("*****  0.结束游戏   *****\n");
	printf("*************************\n");
}
void play()
{
	int ret = rand()%100+1;
	int num;
	//printf("%d\n", ret);
	printf("请输入你猜的数字\n");
	while(1)
	{
		scanf("%d", &num);
		if (num > ret)
		{
			printf("猜大了,请重新选择\n");
		}
		else if (num < ret)
		{
			printf("猜小了,请重新选择\n");
		}
		else
		{
			printf("恭喜你,猜对了!!!");
		}
	}
}
int main()
{ 
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			play();
			printf("开始猜数字\n");
			break;
		case 0:
			printf("结束游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

总结

本小节主要讲解了猜数字游戏的实现,讲解的非常详细,希望读者可以从中获得一些感悟。取得一定的进步,不要忘记点赞加关注哦!!!

你可能感兴趣的:(【C语言小游戏】,游戏,c语言,c++,开发语言,visual,studio)