按照二叔的要求,我用python随便写了个小游戏,发现一个之前没发现的细节问题,接下来用一个猜数字的游戏来模拟现场。
问题描述
import random
print('''我有一个1-100的数字,你猜猜是几:
(输入0可以退出游戏哦!说出101我可以直接告诉你。)''')
j=random.randint(1,100)
a=1
while a<=5: #给玩家5次机会
i=int(input())
if i<1 or i>101:
print("不可以这样猜!")
#玩家选择直接告诉他
if i==101:
print("它是%d,你有想到没!"%j)
#玩家中途退出
elif i==0:
print("退出游戏!") #退出游戏标志
break
elif i<j: #当玩家的数小了
print("不好意思,小了!")
print("再给你%d次机会!"%(5-a))
a+=1
continue
elif i>j: #当玩家的数小了
print("不好意思,大了!")
print("再给你%d次机会!"%(5-a))
a+=1
continue
elif a==5: #机会全部用完
print("很遗憾!你都答错了。")
print("这个数字是%d"%j)
break
elif i==j: #当玩家猜对了
print("恭喜你!答对了。")
break
else:
print("退出游戏!") #退出游戏标志
这里其实出现了两个问题,一是该游戏当机会用尽自己退出,并不会告诉原因,就是提示"退出游戏"。这是因为当a=5时,循环会继续执行,这是输入的i任然在if里判断,并在i<j或i>j这里截断(continue),就不会执行到后面的a=5,这里就直接执行到else语句。之后就对循环做出了这样的修改:
while a<=5: #给玩家5次机会
i=int(input())
if i<1 or i>101:
print("不可以这样猜!")
#玩家选择直接告诉他
if i==101:
print("它是%d,你有想到没!"%j)
#玩家中途退出
elif a==5: #机会全部用完
print("很遗憾!你都答错了。")
print("这个数字是%d"%j)
break
elif i==0:
print("退出游戏!") #退出游戏标志
break
elif i<j: #当玩家的数小了
print("不好意思,小了!")
print("再给你%d次机会!"%(5-a))
a+=1
continue
elif i>j: #当玩家的数小了
print("不好意思,大了!")
print("再给你%d次机会!"%(5-a))
a+=1
continue
elif i==j: #当玩家猜对了
print("恭喜你!答对了。")
break
else:
print("退出游戏!") #退出游戏标志
通过第一次改之后,发现第二个问题是当第5次正好猜对了这个数,但是依然会提示"很遗憾!你答错了。这个数字是?"。其实这里与第一个问题相似,要是a=5的判断在i=j判断前面,那么在第5次输入的数将执行不到后面(break)。后来又改了这个循环:
import random
print('''我有一个1-100的数字,你猜猜是几:
(输入0可以退出游戏哦!说出101我可以直接告诉你。)''')
j=random.randint(1,100)
a=1
while a<=5: #给玩家5次机会
i=int(input())
if i<1 or i>101:
print("不可以这样猜!")
#玩家选择直接告诉他
if i==101:
print("它是%d,你有想到没!"%j)
#玩家中途退出
elif i==0:
print("退出游戏!") #退出游戏标志
break
elif i==j: #当玩家猜对了
print("恭喜你!答对了。")
break
elif a==5: #机会全部用完
print("很遗憾!你都答错了。")
print("这个数字是%d"%j)
break
elif i<j: #当玩家的数小了
print("不好意思,小了!")
print("再给你%d次机会!"%(5-a))
a+=1
continue
elif i>j: #当玩家的数小了
print("不好意思,大了!")
print("再给你%d次机会!"%(5-a))
a+=1
continue
else:
print("退出游戏!") #退出游戏标志
后来我查了一下,其实if…elif…else本身就是按顺序来执行的,只要先于后面判断条件的条件在前面为真,那么后面的判断都不执行
break:直接跳出循环体
continue:返回循环体头部,直接进去下一次循环。