【C语言小游戏】数字猜谜游戏
程序的需求以及最终代码展示
这个是最重要的一步,我们得先直到程序需要有什么需求,才能方便我们进行后面的操作
1.程序会声称1~100之间的随机数
2.猜数字
(1)猜小了,程序提示猜小了,继续猜
(2)猜大了,程序提示猜大了,继续猜
(3)猜中了,程序提示猜中了,游戏结束
3.游戏可以反复玩
这里直接给出最终代码展示,读者可以先自行阅读,然后看文章的讲解是如何实现出这个代码的。
#include<stdio.h> #include<stdlib.h> #include<time.h> 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<stdio.h> 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<stdio.h> 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,无从下手。
在这里虽然说我们的游戏还没有成功制作好,但是我们的界面已经完成了。
三、实现选择分支
这个需求我们主要是用来实现如果选择这个,则需要进入哪一个环节。选择的不是0和1,又该何去何从呢?经过思考,显然switch比较适合一些,因为它比较简洁,而且其拥有一个default语句。实在是再适合不过了。那么我们来简单的实现一下吧
#include<stdio.h> 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; }
我们继续测试一下功能
可见符合我们的预期。
四、实现具体的游戏功能
要实现游戏功能,那肯定得把游戏的代码放在case为1的条件下,但是如果直接放进去,显得代码过于冗杂,所以我们不妨和一开始的菜单一样,将他封装到函数里面。在这个函数里面实现具体的功能,我们不妨让这个函数为 void game(),不需要参数,也不许返回任何一个东西,只要直接调用这个函数,就可以直接进行游戏。
那么游戏内部的功能该如何实现呢?
我们将其分为两步:第一步生成随机数,第二步猜数字。
1.生成随机数
如何生成随机数才是这个道题最大的难关。在这里我们需要了解一个函数rand,rand函数是专门用来生成随机数的。那么rand该怎么用呢?,我们再次打开我们的cplusplus网站查找这个库函数。在这里我们再次贴出这个网站 :c语言库函数,在这个网站中,我们搜索rand,遇到以下界面
我们可以从这个网站的介绍中得知,rand是一个无参数的,返回类型是int的函数,它的作用是生成一个随机数。并且返回这个0~RAND_MAX之间的一个整数。那这里我们要了解RAND_MAX是什么东西?
我们直接把它复制粘贴到我们的visual stdio编译器上,注意要放到一个函数里面,然后我们右击它,点击转到定义。如下图所示
我们会进入到这样一个界面
在前面的学习中我们也了解到了define这个预处理指令的作用是什么(如果已经忘记了的话,我这里直接给出链接:第一站:初识C语言(第四幕))RAND_MAX其实就是我们的0x7fff这个十六进制数,这个十六进制数的大小我们也可以简单的计算一下它的十进制数也就是32767(如果想要知道计算原理的话,也在前面的文章中已经讲到,这里给出链接:进制转换)也就是说,我们 这个rand可以生成一个0~32767之间的数字。那我们不妨在程序里面进行执行以下看看效果如何?
#include<stdio.h> #include<stdlib.h> 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; }
我们运行一下
一眼看过去,貌似还不错啊,但是事情真的那么简单吗?,读者可以多次运行以上的代码,会发现一个很诡异的事情,那就是我每次生成的随机数都一模一样啊,这可如何是好啊。那这样我玩这个游戏玩一把就腻了啊。所以说,我们要解决这种情况。
我们继续回到那个网站,在研究一下,我们会发现中间有句话已经说到了,调用rand之前,需要使用srand函数,也就是说rand函数使用之前要使用srand函数来设置随机数的生成器,通俗的来说就是使用rand之前必须使用srand。那srand该如何用呢?我们继续使用cplusplus网站,来搜素srand
我们经过阅读以后得知,srand要传入一个无符号整型的数字,不返回任何值。它的作用是设置随机数的初始值。我们可以实践一下
嗯?怎么都是38,我把这个0换成1试试?