猜數字遊戲
前面幾章學的東西,這裡第一次真的組在一起做一個小遊戲:電腦隨機想一個數字,你來猜,它會把範圍越縮越小,直到你猜中。
會用到這幾樣:
random.randint():讓電腦隨機選一個答案。- 函式:把「出題」、「讀輸入」、「玩一局」拆成三個函式,各做一件事。
while True和continue、return:只要還沒猜對,就一直讓你猜。try/except ValueError:使用者亂打文字時不要讓程式當掉。None和is None:用來表示「這次輸入不合格,沒拿到數字」。
按「執行」,程式會隨機選一個 1 到 100 的答案。前兩個預設輸入故意給了一個文字和一個超出範圍的數,你可以看到程式怎麼把它們擋下來;第三個開始才是正常的猜測。照著提示的範圍一路猜下去,直到猜中為止:
import random
def create_ans(start=1, end=100): return random.randint(start, end)
def get_number_from_user(start, end): user_input = input(f"請輸入介於 {start} ~ {end} 的整數:")
try: user_input = int(user_input) except ValueError: print("請輸入一個整數") return None
if not (start <= user_input <= end): print("請輸入介於範圍內的數") return None
return user_input
def play(start, end): ans = create_ans(start, end)
while True: user_guess = get_number_from_user(start, end) if user_guess is None: continue
if user_guess == ans: print("恭喜你答對了") return
if user_guess < ans: start = user_guess + 1 else: end = user_guess - 1
play(1, 100)因為答案是隨機的,每次按「重新執行」都會換一個新的答案。同一場遊戲裡繼續猜,答案不會變。
這支程式分成三個函式,最後一行 play(1, 100) 才真的開始玩。
create_ans:出題
Section titled “create_ans:出題”def create_ans(start=1, end=100): return random.randint(start, end)只做一件事:在 start 到 end 之間隨機挑一個數回傳。兩個參數都有預設值,所以直接寫 create_ans() 也行,會出 1 到 100 的題目。
get_number_from_user:讀一個合格的數字
Section titled “get_number_from_user:讀一個合格的數字”這個函式負責把使用者的輸入變成一個可以用的整數,不合格就回傳 None。它有三個關卡:
input()讀進來的一定是字串,先用int()轉成整數。使用者如果打了abc,int()會丟出ValueError,這裡用try/except接住它,印出提示後return None。- 轉成功了,再檢查有沒有落在範圍內。
start <= user_input <= end是 Python 特有的連續比較寫法,等於start <= user_input and user_input <= end;前面加not就是「不在範圍內」,同樣印出提示、回傳None。 - 兩關都過了,才把整數回傳出去。
先處理不合格的情況、提早 return,合格的路留到最後,這是函式那章講過的寫法。呼叫端拿到 None 就知道這次輸入沒有用。
play:玩一局
Section titled “play:玩一局”def play(start, end): ans = create_ans(start, end)先出題,把答案存在 ans。答案不會印出來,玩的人只能靠提示去猜;寫程式的時候如果想快速確認邏輯對不對,可以暫時在這行後面加一行 print(ans),測完再刪掉。
接著是主迴圈。while True 是無窮迴圈,靠迴圈裡的 return 結束:
get_number_from_user(start, end)拿這次的猜測。拿到None代表輸入不合格,用continue直接跳回迴圈開頭再問一次,不往下比。- 猜中了,印出恭喜,
return結束整個函式,迴圈自然也結束。 - 猜太小,答案一定在更大的那邊,所以把下限
start改成user_guess + 1;猜太大就把上限end改成user_guess - 1。
改了 start 和 end 之後,下一圈 get_number_from_user(start, end) 的提示就會顯示縮小後的範圍,也會用新的範圍去檢查輸入。所以玩起來才會看到「請輸入介於 51 ~ 74 的整數」這種提示,而不是每次都寫 1 ~ 100。
v0.9.1 (c924b5b)