互動闖關
1A2B 猜數字 選擇題挑戰
用選擇題一步步寫出完整遊戲!
A = 數字對、位置也對
B = 數字對、但位置不對
答案 [1,2,3,4],猜 [1,2,4,3] → 2A2B
1、2 位置正確(2A),4、3 數字對但位置錯(2B)
Chapter 1
產生不重複的 4 位數答案
用 list 和 random 模組隨機出題
Chapter 1 — Q1
建立 0~9 的數字清單
range(10) 產生 0~9 的序列,用 list() 轉成串列
哪個能建立 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]?
digits = range(10)
digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
digits = list(range(10))
Chapter 1 — Q2
打亂順序
random.shuffle() 會就地 打亂 list,不會回傳新的 list
也就是說它會直接修改原本的 digits
哪個寫法正確?
digits = random.shuffle(digits)
random.shuffle(digits)
digits = digits.shuffle()
Chapter 1 — Q3
取出前 4 個數字當答案
切片 list[start:end] 可以取出 list 的一部分,不包含 end
digits = [7, 1, 9, 3, 0, 5, 8, 2, 6, 4]
answer = ______
空格要填什麼?
digits[:4]
digits[4]
digits[1:4]
Chapter 2
取得輸入 & 驗證
確保玩家輸入的是 4 位不重複的數字
Chapter 2 — Q1
驗證輸入格式
玩家可能亂輸入,需要同時檢查:
1. 長度是否為 4
2. 是否全部都是數字(.isdigit())
guess_str = input("請輸入你的猜測:")
______
print("請輸入 4 位數字!")
continue
空格要填什麼?
if len(guess_str) != 4:
if not guess_str.isdigit():
if len(guess_str) != 4 or not guess_str.isdigit():
Chapter 2 — Q2
字串轉成數字 list
input() 回傳的是字串 "1234"
答案是 list of int [1, 2, 3, 4],所以需要把每個字元轉成整數
哪個能把 "1234" 變成 [1, 2, 3, 4]?
guess = int(guess_str)
guess = [int(c) for c in guess_str]
guess = list(guess_str)
Chapter 2 — Q3
檢查數字是否重複
set() 會自動去除重複元素
例如 set([1, 1, 2, 3]) → {1, 2, 3},長度變 3
guess = [1, 1, 2, 3]
______
print("數字不能重複!")
continue
空格要填什麼?
if guess[0] == guess[1]:
if set(guess) != guess:
if len(set(guess)) != 4:
Chapter 3
計算 A 和 B
用 list comprehension + sum 聰明算出結果
Chapter 3 — Q1
計算 A(位置正確)
list comprehension + sum 技巧:
[1 for i in range(4) if 條件] 會產生一個裝滿 1 的 list
再用 sum() 加總,就能算出有幾個符合條件
哪個能正確計算 A?
a = sum([1 for i in range(4) if guess[i] in answer])
a = sum([1 for g in guess if g in answer])
a = sum([1 for i in range(4) if guess[i] == answer[i]])
Chapter 3 — Q2
計算 B 的思路
先算出「猜的數字有幾個出現在答案中」(包含 A 和 B)
再減掉 A ,剩下的就是純 B
answer = [1, 2, 3, 4]
guess = [1, 3, 5, 6]
B 的公式是什麼?
B = 猜中的總數 + A
B = 猜中的總數 - A
B = 4 - A
Chapter 3 — Q3
寫出 B 的程式碼
a = sum([1 for i in range(4) if guess[i] == answer[i]])
b = ______
空格要填什麼?
sum([1 for g in guess if g in answer]) - a
sum([1 for g in guess if g in answer])
sum([1 for g in guess if g not in answer])
Chapter 4
遊戲迴圈與輸出
讓遊戲跑起來,告訴玩家結果
Chapter 4 — Q1
遊戲主迴圈
while True 搭配 break 是最常見的遊戲迴圈寫法
玩家猜到 4A 時 break 跳出
哪個能讓遊戲一直跑到猜對為止?
while True:
# ... 猜測與計算 ...
if a == 4:
print("恭喜猜對!")
break
while guess != answer:
# ... 猜測與計算 ...
for i in range(100):
# ... 猜測與計算 ...
Chapter 4 — Q2
印出幾 A 幾 B 複選題
有多種方式可以印出結果,選出所有能正確印出 2A1B 的寫法
a = 2
b = 1
選出所有正確的寫法(可複選):
print(f"{a}A{b}B")
print(str(a) + "A" + str(b) + "B")
print("a" + "A" + "b" + "B")
print("{}A{}B".format(a, b))
確認答案
Chapter 4 — Q3
猜對時顯示答案
答案是 list of int 如 [7, 1, 9, 3]
要印成 "7193",需要把每個數字轉回字串再串接
answer = [7, 1, 9, 3]
print(f"答案就是 {______ }")
空格要填什麼?
answer
''.join(str(d) for d in answer)
str(answer)
Chapter 5
流程整合 & 完整遊戲
把所有片段拼起來,完成 1A2B!
Chapter 5 — Q1
continue 的作用
while True:
guess_str = input("請輸入:")
if len(guess_str) != 4 or not guess_str.isdigit():
print("請輸入 4 位數字!")
continue
# ... 後續計算 ...
continue 在這裡做了什麼?
結束整個遊戲
跳過後續計算,直接回到 while 開頭重新輸入
繼續執行後面的程式碼
Chapter 5 — Q2
正確的程式流程 複選題
以下哪些流程描述是正確的?(可複選)
答案應該在迴圈「之前」產生,只產生一次
答案應該在迴圈「裡面」產生,每次都不同
輸入驗證不通過時用 continue 跳過,不進行 AB 計算
計算 B 之前不需要先算出 A
確認答案
Chapter 5 — 完整程式碼
恭喜完成!完整的 1A2B
import random
# 產生答案:0~9 洗牌後取前 4 個
digits = list (range (10))
random.shuffle(digits)
answer = digits[:4]
print ("1A2B 猜數字遊戲!請猜一個 4 位不重複數字" )
while True :
guess_str = input ("請輸入你的猜測:" )
# 驗證輸入:長度為 4 且全是數字
if len (guess_str) != 4 or not guess_str.isdigit():
print ("請輸入 4 位數字!" )
continue
# 字串轉成數字 list
guess = [int (c) for c in guess_str]
# 驗證不重複
if len (set (guess)) != 4:
print ("數字不能重複!" )
continue
# 計算 A(位置與數字都正確)
a = sum ([1 for i in range (4) if guess[i] == answer[i]])
# 計算 B(數字對但位置錯)= 猜中總數 - A
b = sum ([1 for g in guess if g in answer]) - a
print (f "{a}A{b}B" )
if a == 4:
print (f "恭喜你猜對了!答案就是 {''.join(str(d) for d in answer)}" )
break
▶ 到 Playground 試試看
闖關完成!
你已經學會了:
list 切片 • random.shuffle() • set() 去重
list comprehension • sum() 計數 • while + break + continue
挑戰:試試加入「限制 10 次機會」或「紀錄猜測歷史」的功能!