S4E07 你可以几次可以猜到答案
可能你玩过这样的一个小游戏:某人在1-100之间想一个数,另外一群人来猜数字,每次只告知猜大还是猜小,直到猜到目标。那么一个人是否就没有办法玩这个游戏了呢?不存在的!今天我们就自己使用Kesci平台利用Python编辑这样的一个小游戏。
今天这节课,你将收获:
1. 使用Python产生随机数
2. 使用Python产生一个输入框
3. 理解循环语句while……
4. 理解条件语句if……else……
有没有觉得场景似曾相识?既然要猜数字,那么就得先有一个“随机”产生的数字;第二个就是输入数字,最后匹配,看是否一致,并给出判断。对,我们在GGB里面也有过类似的操作,今天我们看一下Python里面的语言吧?
01 猜骰子所掷出的数字
A. 用random产生一个随机数
Python里面有很多的指令,我们可以直接调用出来使用。使用import来调用random,然后来产生一个随机数。指令如下:
import random
a = random.randint(最小数,最大数) 【命名a 为随机数的名字】
你可以使用指令掷一个骰子吗?【答案见①】
B. 使用input来让游戏者输入数字
产生一个输入框,可以使用input指令。
a=input()
外部输入的对象为 a
你可以完成下面的指令吗?答案见②
import random
ans = random.randint(1,6)
guess = ???("Guess a number between 1 and 6: ")
print("Answer {}. Guesss: {}".format(ans,guess))
C. 让游戏者反复猜测,直到猜中才停止
我们看到上面的效果图中,使用者只能猜测一次就结束了,我们想让游戏者一直猜测,直到猜对位置。这时候,我们可以使用循环语句。当游戏者猜测的数字不等于结果时,让使用者继续猜测。
while(条件):
执行的程序……(注意,需要缩进)
我们可以在让游戏者输入猜测的数字之后,判断输入的数字和产生的随机数的关系,然后再做出相应。请填写下面的???处,提示,不等于用“!=”来表示。
import random
ans = random.randint(1,6)
guess = int(input("Guess a number between 1 and 6: "))
while(???):
guess = int(input("Wrong! Guess again! "))
print("Bingo!!! The Answer is {}.".format(ans))
D.累计猜测的次数
我们可以在执行一次while这个循环一次,就增加游戏者猜测的次数。我们可以像在GGB中一样,命名一个次数,首先初始值是1,执行一次while就次数+1。
我们可以在while执行前定义次数为1,执行一次次数+1。
你可以完成下面的指令吗?答案见④
import random
ans = random.randint(1,6)
guess = int(input("Guess a number between 1 and 6: "))
guessTime = 1
while(guess != ans):
guess = int(input("Wrong! Guess again! "))
???
print("Bingo!!! The Answer is {}. You used {}time(s).".format(ans,guessTime))
02 猜测1-31的一个数字,并显示猜测大还是小
A.修改参数,设置猜测范围为1-31,你可以修改上面的程序吗?答案见⑤
B.判断太大或者太小
当猜测数字小于正确答案时,显示猜测小了,再试一次;当猜测数字大于正确答案时,显示猜测大了,再试一次;并且猜测次数+1。
我们可以在while判断猜测数字和结果不一致时,在判断大小。可以使用if……else……条件语句。
if(条件1):
执行指令1
else:
执行指令2
注意:一定要有“:”
你可以完成下面的程序吗?答案见⑤
import random
ans = random.randint(1,31)
guess = int(input("Guess a number between 1 and 31: "))
guessTime = 1
while(guess != ans):
if ???:
guess = int(input("Too Small! Guess again! "))
else:
guess = int(input("Too Large! Guess again! "))
guessTime += 1
print("Bingo!!! The Answer is {}. You used {} time(s).".format(ans,guessTime)
C.给出错误猜测结果后的继续猜测的范围
当我们判断猜测数小了之后,那么新猜测的数字就成为了猜测范围的最低值。我们可以把最低值赋给新猜测的数,给出游戏者新的猜测范围,便于游戏者继续进行猜测。
你可以完成下面的指令吗?答案见⑥
import random
lower = 1
upper = 31
ans = random.randint(lower, upper)
guess = int(input("Guess a number between {} and {}: ".format(lower,upper)))
guessTime = 1
while(guess != ans):
if guess < ans:
lower = ???
guess = int(input("Too small! Guess a number between {} and {}: ".format(lower,upper)))
else:
upper = ???
guess = int(input("Too Large! Guess a number between {} and {}: ".format(lower,upper)))
guessTime += 1
print("Bingo!!! The Answer is {}. You used {} time(s).".format(ans,guessTime))
D. 答案修正
当游戏者如果输入的答案不在范围内,系统也会给出一个答案,所以我们在执行第一个if判断之前,先需要做一个初步的判断,如果不在此范围内,则告知出错。
你可以完成下面的指令吗?答案见⑦
import random
lower = 1
upper = 31
ans = int(random.randint(lower, upper))
guess = int(input("Guess a number between {} and {}: ".format(lower,upper)))
guessTime = 1
while(guess != ans):
if????
if guess < ans:
lower = guess + 1
guess = int(input("Too small! Guess a number between {} and {}: ".format(lower,upper)))
else:
upper = guess - 1
guess = int(input("Too Large! Guess a number between {} and {}: ".format(lower,upper)))
guessTime += 1
else:
guess = int(input("Error! Guess a number between {} and {}: ".format(lower,upper)))
print("Bingo!!! The Answer is {}. You used {} time(s).".format(ans,guessTime))
03 动态调整答案
皮一下,如何让游戏者用最多的次数猜到正确答案。
如果我们通过游戏者的猜测过程动态调整正确答案,那么游戏者就需要猜测更多的次数来找到结果。你觉得可以怎么修改呢?动手试一试吧?答案见视频
答案区
①
import random
ans = random.randint(1,6)
print(ans)
②
input
③
guess != ans
④
guessTime += 1或者guessTime =guessTime +1
⑤
guess<ans
⑥
lower = guess + 1
upper=guess-1
⑦
lower <= guess and guess <= upper
参考资料
【Bili】https://www.bilibili.com/video/av75790756
【Kesci】https://www.kesci.com/home/project/5dcdf573413f87002cc44642
【Kesci】https://www.kesci.com/home/project/5dcd4891413f87002cc42b7d