← 返回大綱
互動闖關

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]

Chapter 1 — Q2

打亂順序

random.shuffle()就地打亂 list,不會回傳新的 list
也就是說它會直接修改原本的 digits

哪個寫法正確?

Chapter 1 — Q3

取出前 4 個數字當答案

切片 list[start:end] 可以取出 list 的一部分,不包含 end
digits = [7, 1, 9, 3, 0, 5, 8, 2, 6, 4] # 打亂後 answer = ______ # 取前 4 個 → [7, 1, 9, 3]

空格要填什麼?

Chapter 2

取得輸入 & 驗證

確保玩家輸入的是 4 位不重複的數字

Chapter 2 — Q1

驗證輸入格式

玩家可能亂輸入,需要同時檢查:
1. 長度是否為 4
2. 是否全部都是數字(.isdigit()
guess_str = input("請輸入你的猜測:") ______ print("請輸入 4 位數字!") continue

空格要填什麼?

Chapter 2 — Q2

字串轉成數字 list

input() 回傳的是字串 "1234"
答案是 list of int [1, 2, 3, 4],所以需要把每個字元轉成整數

哪個能把 "1234" 變成 [1, 2, 3, 4]

Chapter 2 — Q3

檢查數字是否重複

set() 會自動去除重複元素
例如 set([1, 1, 2, 3]){1, 2, 3},長度變 3
guess = [1, 1, 2, 3] ______ print("數字不能重複!") continue

空格要填什麼?

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?

Chapter 3 — Q2

計算 B 的思路

先算出「猜的數字有幾個出現在答案中」(包含 A 和 B)
減掉 A,剩下的就是純 B
answer = [1, 2, 3, 4] guess = [1, 3, 5, 6] # 猜的數字中,有出現在答案裡的:1, 3 → 共 2 個 # 其中 A = 1(只有 1 位置正確) # 所以 B = 2 - 1 = 1

B 的公式是什麼?

Chapter 3 — Q3

寫出 B 的程式碼

a = sum([1 for i in range(4) if guess[i] == answer[i]]) b = ______

空格要填什麼?

Chapter 4

遊戲迴圈與輸出

讓遊戲跑起來,告訴玩家結果

Chapter 4 — Q1

遊戲主迴圈

while True 搭配 break 是最常見的遊戲迴圈寫法
玩家猜到 4A 時 break 跳出

哪個能讓遊戲一直跑到猜對為止?

Chapter 4 — Q2

印出幾 A 幾 B 複選題

有多種方式可以印出結果,選出所有能正確印出 2A1B 的寫法
a = 2 b = 1

選出所有正確的寫法(可複選):

Chapter 4 — Q3

猜對時顯示答案

答案是 list of int 如 [7, 1, 9, 3]
要印成 "7193",需要把每個數字轉回字串再串接
answer = [7, 1, 9, 3] print(f"答案就是 {______}") # 印出 "答案就是 7193"

空格要填什麼?

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 在這裡做了什麼?

Chapter 5 — Q2

正確的程式流程 複選題

以下哪些流程描述是正確的?(可複選)

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

闖關完成!

你已經學會了:
list 切片 • random.shuffle()set() 去重
list comprehension • sum() 計數 • while + break + continue

挑戰:試試加入「限制 10 次機會」或「紀錄猜測歷史」的功能!