跳到內容

猜數字遊戲

前面幾章學的東西,這裡第一次真的組在一起做一個小遊戲:電腦隨機想一個數字,你來猜,它會把範圍越縮越小,直到你猜中。

會用到這幾樣:

  • 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) 才真的開始玩。

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。它有三個關卡:

  1. input() 讀進來的一定是字串,先用 int() 轉成整數。使用者如果打了 abc,int() 會丟出 ValueError,這裡用 try / except 接住它,印出提示後 return None。
  2. 轉成功了,再檢查有沒有落在範圍內。start <= user_input <= end 是 Python 特有的連續比較寫法,等於 start <= user_input and user_input <= end;前面加 not 就是「不在範圍內」,同樣印出提示、回傳 None。
  3. 兩關都過了,才把整數回傳出去。

先處理不合格的情況、提早 return,合格的路留到最後,這是函式那章講過的寫法。呼叫端拿到 None 就知道這次輸入沒有用。

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)