C语言——猜数字mini游戏编程思考

前言

作为0基础编程小白,因为玩了很多游戏,萌生了对开发游戏的渴望,路漫漫其修远兮,我自知离游戏开发的路程还很遥远,要学习的也有很多很多,但迈出了第一步,后面的路终将会有走到头的一天。我希望通过写博客记录自我学习的思维逻辑,以及培养输出观点的表达能力,不断地记录自己学习历程,以便总结回顾。所写内容均为本人拙见,如若有误,还望大神前辈们指点一二。

                                                                                                                                                           

实现过程 

要求:一个猜数字游戏;游戏中会自动产生一个1-100之间的数;猜对了,恭喜你;猜错了,告诉你猜大了还是猜小了,直至猜对为止。

1.解构游戏

众所周知,进入游戏率先映入眼帘的是游戏菜单选项,可以选择开始游戏或者退出游戏,点击开始游戏即猜数字游戏开始,点击退出游戏则游戏结束,程序停止运行。再然后,选择开始游戏后,程序会随机生产一个1-100的数字但不会显示,玩家输入一个数字,猜错了便告知猜大了or猜小了,再继续输入数字循环,直至猜对了,提示"恭喜你,猜对了“。

由此可知,我们需要一个主函数int main(),在其内部运行菜单menu,游戏程序game,以及循环和分支语句。

2.程序编写

2.1大体框架

首先搭设出游戏大体框架。开始运行程序,显示菜单界面,菜单上可以选择”1.PLAY“,”0.EXIT“。这里可分为三种情况,输入1,菜单消失,游戏开始;输入0,则程序结束;既不是0或1,则提示“选择错误,重新选择”并重新显示菜单。

要想实现这一过程,我使用do while循环语句,因为do while语句是出口条件循环,即在完成循环后才会根据while条件决定是否再次执行循环,故该循环至少执行一次,可以满足我们的需求。在do while循环中,还需嵌套switch分支语句,switch是多分支语句,在分支较多的情况下较为适用,通过do while和switch语句可实现:“输入1,菜单消失,进入游戏;输入0,结束循环;输入!0或!1,则重新进入菜单循环”。写出该循环。

1.int定义一个变量input,即我们输入值

2.do while循环贯穿游戏始终,包含menu,game和switch

3.scanf为输入函数,得到输入值input

4.input进入switch分支选择,无论输入任何值,都将break结束switch循环

5.结束do内容后,while通过input条件判断是否继续循环(若input = 0,则0为假,while结束循环;若input = !0,则为真,继续循环)

2.2menu编写

搭设完大体框架后,只需定义menu和game即可完成游戏。首先,定义menu,只需menu上显示两个选项“1.PLAY”,“0.EXIT”,使用printf打印即可。

2.3game编写

最后,最重要的便是游戏程序编写。我们需要随机生成一个1-100的数字,并且在玩家输入一个数后,告知其是否猜对,猜错则继续输入数字直至猜对。

首先,生成随机数需要使用rand函数。rand函数的功能是生成一个随机数,界限是[0,32767]。rand函数生成随机数的方法是:rand()%a;其中a是一个整型,返回值为0到a的随机数,包含0,但不包含a。但rand函数被一个a值和一个隐藏的全局变量seed控制,导致其生成的是伪随机数,重复运行几次生成的数是一样的。

在调用rand函数之前,会先查询是否主动调用过srand(seed)来为伪随机数生成器设定种子,如果有,那么就按照我们的代码设定种子,即初始化seed的起始值,若没有调用srand(seed),那么系统会自动给seed赋初始值,即自动调用srand(1)一次,也就是将seed的值设置为1。如果每次调用rand函数时,种子相同,那么根据公式产生的伪随机数将是相同的。

所以为了让每次产生的随机数不相同,那么我们就需要让每次调用rand函数之前设定的种子不相同,我们可以使用系统时间作种子srand(time(NULL));由于每次运行程序的时间肯定不相同,那么每次设定的种子也就不相同,那么产生的随机数肯定也就不一样了。
————————————————
版权声明:本文为CSDN博主「北冥有鱼丶丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44049823/article/details/127073682

 这里使用time函数即时间戳,将得到的time类型数据转化为(unsigned int)的数,再传给srand函数:((unsigned int)time(NULL)),运行这段代码,每次都会获得不同的随机数。有一点需要注意,((unsigned int)time(NULL))函数如果运行次数太快,则会导致出现的随机数差距很小,甚至一样,故为了保证一轮游戏只设置一次seed值,将srand((unsigned int)time(NULL))函数放在主函数内。

但我们需要的是1-100的随机数,可rand函数返回的数范围太大了,我们用rand()%100即可获得0-99的数据范围(任何数除100取余都是0-99之间的数),则rand()%100+1= [0,100]。

随机数生成的问题解决了,我们只需要解决输入数字guess后告知是否猜对,猜错则继续输入数字直至猜对的问题。这里使用一个不同的分支语言——if(之所以不使用switch分支语言,因为输入值guess是不确定的,case语句无法进行分支选择),比较输入值guess与rand生成的随机数,如果是>,则printf猜大了;如果是<,则printf猜小了;如果不是>也不是<,则printf恭喜你,猜对了。然后将这个if嵌套在一个while循环中,使得猜大了或者猜小了都继续循环,当猜对了则break停止循环。写出game。

至此,整个猜数字mini游戏代码编写完成,代码运行正常。CONGRATULATIONS。

                                                                                                                                                           

结语

此游戏的重难点在于对rand函数的理解,从而正确的生成随机数,还需要对循环语句和分支语句嵌套使用,熟悉掌握这两种语句,保证代码逻辑正确。

  • 26
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值