S4E07 你可以幾次可以猜到答案
可能你玩過這樣的一個(gè)小游戲:某人在1-100之間想一個(gè)數(shù),另外一群人來猜數(shù)字,每次只告知猜大還是猜小,直到猜到目標(biāo)。那么一個(gè)人是否就沒有辦法玩這個(gè)游戲了呢?不存在的!今天我們就自己使用Kesci平臺(tái)利用Python編輯這樣的一個(gè)小游戲。
今天這節(jié)課,你將收獲:
1. 使用Python產(chǎn)生隨機(jī)數(shù)
2. 使用Python產(chǎn)生一個(gè)輸入框
3. 理解循環(huán)語句while……
4. 理解條件語句if……else……
有沒有覺得場(chǎng)景似曾相識(shí)?既然要猜數(shù)字,那么就得先有一個(gè)“隨機(jī)”產(chǎn)生的數(shù)字;第二個(gè)就是輸入數(shù)字,最后匹配,看是否一致,并給出判斷。對(duì),我們?cè)贕GB里面也有過類似的操作,今天我們看一下Python里面的語言吧?
01 猜骰子所擲出的數(shù)字
A.?用random產(chǎn)生一個(gè)隨機(jī)數(shù)
Python里面有很多的指令,我們可以直接調(diào)用出來使用。使用import來調(diào)用random,然后來產(chǎn)生一個(gè)隨機(jī)數(shù)。指令如下:
import?random
a = random.randint(最小數(shù),最大數(shù)) 【命名a 為隨機(jī)數(shù)的名字】
你可以使用指令擲一個(gè)骰子嗎?【答案見①】
B.?使用input來讓游戲者輸入數(shù)字
產(chǎn)生一個(gè)輸入框,可以使用input指令。
a=input()?
外部輸入的對(duì)象為 a
你可以完成下面的指令嗎?答案見②
import?random
ans = random.randint(1,6)
guess =????("Guess a number between 1 and 6: ")
print("Answer {}. Guesss: {}".format(ans,guess))
C.?讓游戲者反復(fù)猜測(cè),直到猜中才停止
我們看到上面的效果圖中,使用者只能猜測(cè)一次就結(jié)束了,我們想讓游戲者一直猜測(cè),直到猜對(duì)位置。這時(shí)候,我們可以使用循環(huán)語句。當(dāng)游戲者猜測(cè)的數(shù)字不等于結(jié)果時(shí),讓使用者繼續(xù)猜測(cè)。
while(條件):
? ? 執(zhí)行的程序……(注意,需要縮進(jìn))
我們可以在讓游戲者輸入猜測(cè)的數(shù)字之后,判斷輸入的數(shù)字和產(chǎn)生的隨機(jī)數(shù)的關(guān)系,然后再做出相應(yīng)。請(qǐng)?zhí)顚懴旅娴????處,提示,不等于用“?”來表示。
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.累計(jì)猜測(cè)的次數(shù)
我們可以在執(zhí)行一次while這個(gè)循環(huán)一次,就增加游戲者猜測(cè)的次數(shù)。我們可以像在GGB中一樣,命名一個(gè)次數(shù),首先初始值是1,執(zhí)行一次while就次數(shù)+1。
我們可以在while執(zhí)行前定義次數(shù)為1,執(zhí)行一次次數(shù)+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 猜測(cè)1-31的一個(gè)數(shù)字,并顯示猜測(cè)大還是小
A.修改參數(shù),設(shè)置猜測(cè)范圍為1-31,你可以修改上面的程序嗎?答案見⑤
B.判斷太大或者太小
當(dāng)猜測(cè)數(shù)字小于正確答案時(shí),顯示猜測(cè)小了,再試一次;當(dāng)猜測(cè)數(shù)字大于正確答案時(shí),顯示猜測(cè)大了,再試一次;并且猜測(cè)次數(shù)+1。
我們可以在while判斷猜測(cè)數(shù)字和結(jié)果不一致時(shí),在判斷大小??梢允褂?strong>if……else……條件語句。
if(條件1):
????執(zhí)行指令1
else:
????執(zhí)行指令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.給出錯(cuò)誤猜測(cè)結(jié)果后的繼續(xù)猜測(cè)的范圍
當(dāng)我們判斷猜測(cè)數(shù)小了之后,那么新猜測(cè)的數(shù)字就成為了猜測(cè)范圍的最低值。我們可以把最低值賦給新猜測(cè)的數(shù),給出游戲者新的猜測(cè)范圍,便于游戲者繼續(xù)進(jìn)行猜測(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. 答案修正
當(dāng)游戲者如果輸入的答案不在范圍內(nèi),系統(tǒng)也會(huì)給出一個(gè)答案,所以我們?cè)趫?zhí)行第一個(gè)if判斷之前,先需要做一個(gè)初步的判斷,如果不在此范圍內(nèi),則告知出錯(cuò)。
你可以完成下面的指令嗎?答案見⑦
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 動(dòng)態(tài)調(diào)整答案
皮一下,如何讓游戲者用最多的次數(shù)猜到正確答案。
如果我們通過游戲者的猜測(cè)過程動(dòng)態(tài)調(diào)整正確答案,那么游戲者就需要猜測(cè)更多的次數(shù)來找到結(jié)果。你覺得可以怎么修改呢?動(dòng)手試一試吧?答案見視頻
答案區(qū)
①
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