乐于分享
好东西不私藏

零基础学 Python(4):电脑猜心小游戏,聊聊 while 和 in 的妙用

零基础学 Python(4):电脑猜心小游戏,聊聊 while 和 in 的妙用

上一节我们了解了while Truebreak在自主循环中的作用,也实现了全天候自动售卖机服务多位顾客的功能。今天,我们一起来写一个电脑猜心小游戏,加强感受一下while命令。

首先是一个游戏程序,拟实现0-50数字(整数)范围内的交互体验。具体玩法为:

1. 心里想一个0-50范围内的数字,让电脑猜;(是时电脑上会出现初始数字)

2. 比较电脑显示数字和心里所想数字的大小,并给出判断“猜大了,小了或者对了。”

3. 电脑会继续给答案,直到猜准为止。

整体采用电脑“二分法”的逻辑设计,系统会默认从中值开始猜,根据玩家的判断不断缩小至精确范围。实现代码参考如下:

基础版

import random

print("你心里想一个0-50的数字,电脑来猜")

print("请判断并回答大,小或者对")

low=0

high=50

while True:

   guess=(low+high)//2

   print(f"{guess}")

   feedback=input("请告诉我猜大、小还是对了")

   if feedback=="大":

       high=guess-1

   elif feedback=="小":

       low=guess+1

   elif feedback=="对":

       break

print("猜对了,再玩一次吧!")

下面我们以30为例,看一下运行效果:

用这个基础版的代码,限定了输入值是且只能是“小、大和对”,如果输入其他相同意思的字段比如“是”,它会一直保持初始值25,没有判断,所以要添加防错机制,输错时怎么办呢?

优化版

这一版对以上基础代码进行了优化,在末尾加上了防错机制(标蓝部分)。如果输入了大”、“小”和“对”之外的字,系统会报错,显示“输入错误,请检查”。实现代码参考如下:

import random

print("你心里想一个0-50的数字,电脑来猜")

print("请判断并回答:大、小或者对")

low = 0

high = 50

while True:

   guess = (low + high) // 2

   print(f"电脑猜:{guess}")

   feedback = input("请告诉我猜大、小还是对了:")

   if feedback == "大":

       high = guess - 1

   elif feedback == "小":

       low = guess + 1

   elif feedback == "对":

       break

else:

       print("输入错误,请检查")

       continue

print("猜对了,再玩一次吧!")

下面我们以30为例,看一下运行效果:

运行结果中显示,输入“啥”确实反馈“输入错误,请检查”;但是输入“对的”,同样进入了纠错程序,那如何解决模糊指令的容错呢?下面我们将通过两个方法将结果增加容错性,进行模糊处理。

容错升级版

方法一:“or”语句

import random

print("你心里想一个0-50的数字,电脑来猜")

print("请判断并回答:大、小或者对")

low = 0

high = 50

while True:

   guess = (low + high) // 2

   print(f"电脑猜:{guess}")

   feedback = input("请告诉我猜大、小还是对了:")

 if feedback == "大" or feedback=="大了":

       high = guess - 1

 elif feedback == "小" or feedback=="小了":

       low = guess + 1

elif feedback == "对" or feedback=="是" or feedback=="对了":

       break

   else:

       print("输入错误,请检查")

       continue

print("猜对了,再玩一次吧!")

本段代码加入了or语句,增加了输入端的容错性。无论是“大”、“大了”还是“小”、“小了”抑或是“对”、“是”、“对了”都可以被判断为猜对,给出并输出相应的判断。

下面我们以30为例,看一下运行效果:

运行结果同预期一致,但“是的”,“对的”等偏离“or”定义区的描述依然被系统判定为“输入错误,请检查。”所以,需要进一步扩大容错区间,我们只需要“大”、“小”和“对”的字样出现即可,所以方法二中我们引入“in”语句。

方法二:“in”语句

import random

print("你心里想一个0-50的数字,电脑来猜")

print("请判断并回答:大、小或者对")

low = 0

high = 50

while True:

   guess = (low + high) // 2

   print(f"电脑猜:{guess}")

   feedback = input("请告诉我猜大、小还是对了:")

if "大" in feedback :

  high = guess - 1

   elif "小" in feedback:

       low = guess + 1

   elif "对" in feedback:

       print("猜对了,再玩一次吧!")

       break

   else:

       print("输入错误,请检查")

       continue

本段代码中限定了“大”、“小”“对”只要存在即可。范围更宽,容错率更大。

下面我们以30为例,看一下运行效果:

可以看出:“大的”、“小了”、“小”、“对的”都可以得到正常的判断值,下面留一个问题给你吧,如何实现循环玩下去呢?While True, break要怎么嵌套呢?欢迎大家讨论交流。

往期精彩

零基础学 Python(1):让电脑学会跟你“聊天”

零基础学 Python(2):写个“超市收银机”和“自动售卖机”!

零基础学Python(3) :搞懂 while True 和 break,写个“猜数字”小游戏!

更多精彩敬请期待中...

微信号丨飞苑的窝

关注 获得 更多 精彩内容