刚学编程面对着黑框框的界面,面对做不完的编程题,是不是觉得枯燥无味,你敲得每一个代码都有用,都在给自己打好基础,建一栋高楼大厦,最开始就要耐心打好地基,今天来点有趣的,让我们来用c语言基础知识实现一个猜数字小游戏吧~
猜数字游戏
猜数字游戏思路↓↓
猜数字游戏实现思路
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示猜大了(“Too big”),还是猜小了(“Too small”),相等表示猜到了。 如果猜到,则结束程序。 程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。
猜数字游戏要用到的知识点
实现猜数字游戏需要掌握 while、do–while循环结构,Switch–case 和if–else分支结构、(对于结构不熟悉的可以看我上一篇博客,坐稳扶好单击右方传送门)→传送门,库函数(rand、srand)、自定义函数,这里简单提到函数章节,在下一篇博客会详细讲解函数。
猜数字游戏整体实现↓↓↓
1.构建游戏运行框架
游戏没有运行框架是没有灵魂的,它就像树没有皮,人没有好看的衣服~游戏也是需要包装的,这样看起来高端上档次。
所谓框架就是用户第一次运行时能弹出可视化菜单,供玩家选择是否玩游戏,如果选择玩游戏,则开始运行游戏,如果选择不玩则结束程序,而玩家玩完一次不过瘾,应再提供一次菜单选择,供玩家继续选择玩还是不玩游戏。
#include<stdio.h>voidmenu(){}voidgame(){}intmain(){int input =0;//定义一个选项变量 do{menu();//打印菜单printf("输入数字选择对应功能\n");scanf("%d",&input);//输入数字选项选择switch(input){case1://当为1时运行自定义游戏函数game();break;//结束分支case0:printf("退出游戏\n");//为0时退出游戏break;default:printf("无效选择请重新输入\n");//选项以外的选择提示错误重新输入break;}}while(input==1||input!=0);//当为表达式里选项为1或者不为0时 会重新进入循环return0;}
上面框架使用了do—while循环,特点是不用判断表达式直接先进入一次循环 此时出现了菜单函数,为了便于维护和提高可视化效果,菜单列标封装在了函数里,通过运行menu()实现菜单功能,同样游戏功能也被封装在game()函数里实现运行游戏的功能。
2.游戏选择菜单实现
菜单就像门面,可以给用户选择,实现人性化操作~下面看代码
在menu函数里用两个printf()函数实现向终端屏幕输出字符 达到输出菜单的效果,实现效果展示↓↓
此时达到了输出菜单的效果,然后供用户选择。
3.游戏过程具体实现
打起精神,重点来了!!!
首先我们要使系统内部产生一个1-100的正整数,我们要用到rand()库函数,使用库函数我们得了解这个函数的用法!
这个函数返回类型是int,参数为空,表示运行该函数会生成一个伪随机整数,
首先我们要设置返回值在1-100间
通过转定义发现该函数最后返回的数是在0-32767之间,所以我们可以通过运行此函数得到该区间的数再模上100加1最后得到1-100间的数字。
此时实现了 电脑内部生成一个1-100的数字↑
通过while(1)表达式为真一直循环玩家输入数字然后使两数比较↑↑ 当最后相等则游戏结束下面看运行代码
通过此思路实现了要达到的效果,但是再进行玩一次游戏时又得到了个不好的效果
每次程序启动第一个猜的数一直是42,这游戏就有bug了,此时进行一个简单的测试
发现虽然是随机了,但是每次运行程序都是42开始然后根据规律随机的一系列数字都是一样的,用户每次玩游戏只要记住了这一串数字就不用猜了,所以这种伪随机达不到想要的结果。
因此,我们还需要一个srand()函数 用来设置rand()函数随机数的起点值,
此函数实现是通过传递的参数 将其作为rand的起点值即rand()第一次生成的数字,因此使用这个函数先用常数1作为参数测试一下↓
发现该函数srand(1)使得rand的起点数设置为了42 但每次运行时都给其设置的42 又没有了随机的效果,那我们想使srand()里面的参数为一个随机数,然后才使rand生成的数是一个随机数要怎么做呢,此时我们可以用时间戳作为参数放到srand中,因为时间的不断变化的,因此每次运行srand得到的值都是不同的使得rand里面的数也不同,达到随机的效果,而使用时间戳要用到time库函数。
通过这个描述我们可以简单设置这个函数实现为(unsigned) time(NULL),因为参数需要指针此时可以设一个空指针使其得到当前时间,而为了防止得到的数字是负数将其强制类型转化为无符号整数,使其为一个正数。
简单测试后发现确实每个数都随机了,但是随机的数之间间隔都太短了,检查发现是因为每次进行游戏都运行了srand使得改变了rand随机起点数而srand每次是根据时间戳变化,猜数字时间间隔断导致每次生成的数字都太相近,此时我们只要将srand函数移至运行程序进入do–while循环前即可,表示运行此游戏以当前时间戳设置rand随机起点值,然后rand每次运行都会得到不同的数并且数字间隔不会太小。
此时程序已经整体达到了游戏实现的效果~
注意:警告显示time srand rand 未定义 ,这是因为引用这三个库函数要包含对应的头文件
time的头文件为 time.h srand 和rand的头文件为 stdlib.h
游戏优化
光猜随机数一直猜下去总会猜到,我们可以做一个小小优化,比如猜中后显示猜数字花了几次,并且可以增加难度当猜数字猜了5次还没猜中则游戏失败重新生成一个随机数,这样使得游戏更有趣~
此设置给 猜中数字后显示猜数字次数提高人性化,猜10次数字没猜中游戏失败给游戏增加了难度。
当我再进行游戏测试时发现,此设置是输入数字选择功能,但是输入一个字母会使得直接出现意想不到的结果,秉着做到最好,不写bug的习惯,我打算将这种情况优化了。以下优化仅供参考,因为以后这个游戏设计不会有输数字给你数字母的情况。
此设计将输入选项设置为字符型,将对应的case入口 设置为字符常量 ,当读取到第一个字符时 此时缓冲区还有其他字符或者\n存在 此时用while循环 表达式里用getchar()函数将输入缓冲区内的无效字符都读取掉,并当读取的第一个字符开始不是回车字符时 将input里的值设为0表示 表示此时input里的值不能调用 开始游戏和退出游戏入口 只能进入默认选项。
作者水平有限,优化暂时到这里了~
最后,将输出系统生成的随机数那行代码删除,否则玩这个游戏每次都可以显示系统数字就跟开挂一样,毕竟这只是后台设置时为了方便调试而写的,真正运行起来,玩家是不能看到该数字的
猜数字游戏源代码展示
猜数字源代码已公布↓↓↓ 快去自己电脑上试试吧
#include<stdio.h>#include<stdlib.h>#include<time.h>voidmenu(){printf("**********1.play***********\n");printf("**********0.exit***********\n");}voidgame(){int count =1;int cp =rand()%100+1;// 得到一个1-100间的整数数 存储在一个变量中 此变量为电脑内部生成的数字/*printf("%d", cp);*///显示系统生成的数字int num =0;while(count<=10)//一个while循环 使 输入的数字和电脑系统生成的数字比较,大了提示猜大了,小了提示猜小了,重新循环输入数字比较,直到相等提示猜对了{printf("输入你要猜的数字:");scanf("%d",&num);//此变量存储的值为自己输入的值 为玩家要输入的数字if(num > cp){printf("数字猜大了\n");
count++;}elseif(num < cp){printf("数字猜小了\n");
count++;}else{printf("猜对了!你花了%d次猜中该数字\n",count);
count =0;break;}}if(count ==11){printf("您猜了10次还没猜中,游戏失败\n");getchar();//读取回车字符}}intmain(){srand((unsigned)time(NULL));char input =0;do{menu();printf("输入数字选择对应功能\n");scanf("%c",&input);while(getchar()!='\n'){if(input=='1'||input=='0')
input =0;}switch(input){case'1':game();break;case'0':printf("退出游戏\n");break;default:printf("无效选择请重新输入\n");break;}}while(input =='1'|| input !='0');//input里的结果为字符1 或者不为字符0时表达式为真进入循环return0;}
作者水平有限,有什么不对的地方,还请大佬指正,我定当虚心采纳,第一时间更正
制作不易,给个一键三连吧~~~
版权归原作者 牛牛要坚持 所有, 如有侵权,请联系我们删除。