Python 程式練習:終極密碼

Ming-jun
4 min readJun 20, 2018

--

教科書上的習題離我們太遠,用生活中的例子練習 Python 3 吧!

遊戲規則

  1. 一人當莊家,從指定數字範圍(例如 1–100)中選出一個正整數當密碼,而且不能讓其他玩家知道。
  2. 玩家輪流猜數字,每猜一個數字,莊家就要告知密碼介於何範圍,一直到密碼被猜中為止(例如密碼是 70,玩家猜 20,這時莊家要告知密碼介於 20 至 100 之間)。

這次我們要練習的題目,是讓電腦當莊家,選定一個介於 1–100 之間的整數,而使用者要輸入數字去猜那個數字,直到猜中為止。沒猜中時電腦會限縮範圍當作提示,讓使用者再次嘗試。

我們希望密碼每次都不一樣,最好是隨機、沒有規律,所以在實作上需要用到內建函式庫 random 裡面的 randint() 功能。randint(a, b) 會隨機挑選一個大於等於 a、小於等於 b 的整數並回傳,以下是範例用法:

import random

number = random.randint(10, 20)
print(number)

順帶一提,匯入內建函式庫的時候,除了 import xxx 這種寫法外,有時候我們只是要用某個函式庫裡面其中一個功能而已,這時我們可以用 from xxx import xxx 這種寫法,就樣就不會把整個函式庫都匯進來囉。例如:

from random import randint

number = randint(10, 20)
print(number)

由於匯入方法不同,兩種寫法會有些差異,要特別留意。

相關概念

  1. 變數 (variables)
  2. 條件判斷 (conditional statements)
  3. 迴圈 (loops/iterations)
  4. 字串 (strings)

相關函式/功能

  1. randint():產生隨機整數
  2. input():讓使用者輸入內容
  3. int():將字串轉換成整數
  4. try & except:處理程式錯誤
  5. while loop:讓使用者重複猜數字

程式試寫

from random import randint

#規定範圍並產生密碼
lowest = 1
highest = 100
answer = randint(lowest, highest)

#重複猜數字,直到猜對為止
while True:
guess = input('密碼介於 ' + str(lowest) + '-' + str(highest) + ':\n>>')

#檢查輸入的內容是否為數字
try:
guess = int(guess) #把字串轉換成整數
except ValueError: #轉換失敗便要求重新輸入數字
print('格式錯誤,請輸入數字\n')
continue

#檢查輸入的數字是否介於規定範圍內
if guess <= lowest or guess >= highest:
print('請輸入 ' + str(lowest) + '-' + str(highest) + ' 之間的整數\n')
continue

#判斷有沒有猜中密碼
if guess == answer:
print('答對了!')
break #猜對才跳脫迴圈
elif guess < answer:
lowest = guess
else:
highest = guess

比較妙的地方是 int() 在這個程式裡扮演的角色(見第 14 行),它的功能是「間接」驗證使用者輸入的內容。由於使用者透過 input() 輸入的東西,格式一律都是字串 ,要直接確認內容是否只有數字並不容易,於是我們轉個彎來操作:用 int() 試著把使用者輸入的內容轉換成整數。如果轉換成功,表示使用者只有輸入數字;如果轉換失敗,表示使用者並非只輸入數字。如此一來便能根據轉換後的結果,反推使用者輸入的內容。

以下是程式實際上執行的樣子,大家可以按右下角的箭頭圖示玩玩看:

--

--