接下来尝试改进数字游戏,循环嵌套已经理解了,为什么突然插入了一个for循环来讲循环嵌套?因为接下来好戏来了。在学习while循环的时候,对第二堂课学过的猜数字游戏进行了改进,可玩性有了提升。
但是真正的使用过程中,有时候会出现一些不符合程序预期的情况,比如设定希望输入的都是数字,但是实际情况中玩家可能什么东西都会输入,字母、符号都往里面甩,怎么办?当时如果输入一个字母、符号之类的就会崩,程序就会崩,怎么办?这就需要对程序进一步的升级和改造。
面对一些不符合预期的情况的时候,可以给出提示让程序继续执行下去,而不是报错停止,这也就是所谓的提升程序的健壮性。结合循环嵌套和字符串的使用,可以对数字猜数字游戏进行输入情况的判断和提示,比如老师输的字母而不是输的数字,这时候游戏应该提示请输入正确的数字。
有了这种改进思路,赶紧跟霸夫老师一起来升级一下代码。前面的代码还是一样的,import random,然后把这个随机产生一个字符串,之前这个代码是这样的,接下来就猜这个数字,如果数字如果是,这里还有个猜测数字,一开始代码是这样的,猜测数字等于int,输入的字符串这是之前的代码。
这种情况下试一下刚才讲的那个情况会不会崩,猜这个数字来个s13,直接崩了,就是因为没有对输入数据做校验,也就是没有判断数据合不合法。这里为什么会崩?大家知道是哪里出了毛病吗?是不是就是int,int对一个字符串不能转成数字的时候,要是强来转化就会报错,强扭的瓜不甜,强行的违背它的意志,对方就撕给你看。
所以说,这边要先判断一下合不合法,不合法就会受到法律的制裁。
合不合法怎么判断?判断是不是数字,是数字才进行后面的操作,如果不是就不进行后面的操作。代码怎么写?就是输入的字符串有了,这里先不着急转化,因为这时候一转化就会报错。
首先来判断一下字符串符不符,符合条件就继续不符合条件,这个就提示让你重新输入。这里while循环要写应该要反过来,如果不符合就一直循环,直到符合为止。所以把判断条件换一下,如果不符合,else不符合,不符合什么东西?不符合。
输入的字符串是一个数字,怎么判断是不是数字?上节课学字符串的时候学过一个函数叫做isdigit,isdigit的意思就是数字,这个字符串是数字,加了not就是取反了这个数字,这个字符串就不是数字。
不是数字应该怎么办?重新输,就输入字符串,重新赋值为控制台的输入内容,一直在里面跟它纠缠,else就是终于符合条件了。条件是什么?not输入的字符串是数字的情况下,对not再次取not,负负得正了就是输入的字符串是数字了。
这时候再把猜测数字进行转化,把字符串转成int这时候就稳了,就不会报错了。来试一试,看这次稳不稳。设个数字来猜一下,毫不客气输了s13,提示输入了非字符数字,继续输,就来个2B,还是不对,有点杠,来个ss还是不行,受不了了,还是要按照规范的,还是要遵纪守法。
输入这个,输这个5,这时候发现情况好像有点不对,它一直说你猜的有点小,一直猜的有点小。这里又犯了一个错误,就在while循环里面,又忘了去更改猜测数字。
猜测数字应该怎么写?刚才有经验了,经验是什么?就是不但要输入一个新的字符串,而且要对字符串进行判断,判断符不符合条件。如果符合条件再进行下一次比对,比对猜测数字跟谜底数字是否一致,就把代码复制粘贴进来,就给它复制粘贴进来就完事了。
放在哪里?放在提示结果后面,大家来看一下,先理一下逻辑。如果第一次猜测的数字不匹配,就给出提示,给出提示之后要给它再一次机会输入,输入之后不能直接就放过你了,必须要再检测输入的结果是否是数字,不是数字不会让你离开这里,必须要输入的是数字才会让你进入到结果比较这里来。
这里写的这一个语句就是一个循环,外面还有个循环,这里就实现了循环嵌套,而且是while循环的嵌套。刚才的for循环嵌套就是为了给大家先练练兵,知道循环是可以嵌套的。这里面while循环嵌套写法其实差不多,也就是把while循环写在另外一个while循环的循环体内,就实现了while循环嵌套了,就是两次循环。
运行看一下,它设置一个数字,这时候输入s13,它不允许,输入一个5,它提示有点小,这次再次让我输入,又写个2B,这时它也进行了判断,让我再次输入正确的数字。刚才已经猜的有点小了,就往大了猜,猜个8,大吉大利今晚吃鸡。
这时候得到了正确的结果执行了else,通过双重循环实现了每一次输入的时候对输入结果进行判断,符合条件才继续执行下一步。经过这么两次改进,第一次改进什么大家知道吗?第一次改进就是这个游戏一直进行下去,如果没猜对一直进行下去。第二次改进,如果输入的数字不符合要求就让你一直重新输入。
经过这两次的改进,程序的可玩性、和健壮性有了很大的提升。
但是大家看到没有,从编码的角度来看问题,从如果作为一个老司机的话,大家看了这里面这一段代码和这段代码是复制粘贴过来的,这里面有重复代码,一个代码如果要写两遍,虽然是复制粘贴,说明这里就有优化空间这些重复代码,其实可以通过定义行数来对它进行简化。
在后面的这个课程中,还会继续学习如何来优化这个游戏代码。今天的课讲到这里就是基本上内容就讲完了。