Spaces:
Running
Running
Publish 26FSunAft week02 final projects
Browse files- projects/2026Fall進階專題/劉宇翰/week02_校園謎案調查局/case_data.json +42 -0
- projects/2026Fall進階專題/劉宇翰/week02_校園謎案調查局/main.py +100 -0
- projects/2026Fall進階專題/林昭廷/week02_校園謎案調查局/case_data.json +42 -0
- projects/2026Fall進階專題/林昭廷/week02_校園謎案調查局/main.py +103 -0
- projects/2026Fall進階專題/游允樂/week02_校園謎案調查局/case_data.json +42 -0
- projects/2026Fall進階專題/游允樂/week02_校園謎案調查局/main.py +105 -0
- projects/2026Fall進階專題/王郁嘉/week02_校園謎案調查局/case_data.json +42 -0
- projects/2026Fall進階專題/王郁嘉/week02_校園謎案調查局/main.py +100 -0
- projects/2026Fall進階專題/陳英赫/week02_校園謎案調查局/case_data.json +42 -0
- projects/2026Fall進階專題/陳英赫/week02_校園謎案調查局/main.py +100 -0
projects/2026Fall進階專題/劉宇翰/week02_校園謎案調查局/case_data.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"title": "消失的校徽",
|
| 3 |
+
"intro": "午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?",
|
| 4 |
+
"locations": {
|
| 5 |
+
"1": {
|
| 6 |
+
"name": "六年一班教室",
|
| 7 |
+
"scene": "展示櫃半開,窗戶也沒有關好。",
|
| 8 |
+
"evidence": {
|
| 9 |
+
"id": "blue_fiber",
|
| 10 |
+
"name": "窗框上的藍色纖維",
|
| 11 |
+
"detail": "纖維顏色和清潔推車的布套相同。"
|
| 12 |
+
}
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "操場司令台",
|
| 16 |
+
"scene": "地面剛拖過,留下一道彎向圖書館的輪痕。",
|
| 17 |
+
"evidence": {
|
| 18 |
+
"id": "wheel_track",
|
| 19 |
+
"name": "沾著亮粉的推車輪痕",
|
| 20 |
+
"detail": "亮粉和展示櫃內的裝飾相同。"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"3": {
|
| 24 |
+
"name": "圖書館",
|
| 25 |
+
"scene": "清潔推車停在書架旁,後方似乎有東西反光。",
|
| 26 |
+
"requires": ["blue_fiber", "wheel_track"],
|
| 27 |
+
"locked_text": "你看見推車,卻還不知道該檢查哪裡。也許要先找出它的移動路線。",
|
| 28 |
+
"evidence": {
|
| 29 |
+
"id": "badge",
|
| 30 |
+
"name": "卡在推車後方的校徽",
|
| 31 |
+
"detail": "校徽沒有損壞,背面黏著一小段藍色纖維。"
|
| 32 |
+
}
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
"conclusions": {
|
| 36 |
+
"1": "有同學故意把校徽藏在圖書館",
|
| 37 |
+
"2": "風吹起校徽,清潔推車不小心把它帶到圖書館",
|
| 38 |
+
"3": "校徽從一開始就放在圖書館"
|
| 39 |
+
},
|
| 40 |
+
"correct_answer": "2",
|
| 41 |
+
"success": "推理正確!風把校徽吹到布套上,推車經過教室後又將它帶到圖書館。這是一場意外。"
|
| 42 |
+
}
|
projects/2026Fall進階專題/劉宇翰/week02_校園謎案調查局/main.py
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Week 2:校園謎案調查局 Starter。
|
| 2 |
+
|
| 3 |
+
先完成 TODO 1~4。程式必須能反覆探索、收集線索、查看證物並提出推理。
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
CASE_TITLE = "消失的dinner"
|
| 7 |
+
|
| 8 |
+
LOCATIONS = {
|
| 9 |
+
"1": {
|
| 10 |
+
"name": "客廳",
|
| 11 |
+
"scene": "家裡的dinner不見了",
|
| 12 |
+
"evidence": "地上飯粒",
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "房間",
|
| 16 |
+
"scene": "房間裡有一股dinner味",
|
| 17 |
+
"evidence": "很臭",
|
| 18 |
+
},
|
| 19 |
+
"3": {
|
| 20 |
+
"name": "廁所",
|
| 21 |
+
"scene": "廁所裡有dinner痕跡",
|
| 22 |
+
"evidence": "地上有你",
|
| 23 |
+
},
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
evidence_bag = []
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def investigate(location_id):
|
| 30 |
+
"""調查地點並將新線索放入證物袋。"""
|
| 31 |
+
# TODO 1:確認 location_id 是否存在於 LOCATIONS。
|
| 32 |
+
if location_id not in LOCATIONS:
|
| 33 |
+
print("location not found")
|
| 34 |
+
return
|
| 35 |
+
# TODO 2:顯示地點名稱與現場描述。
|
| 36 |
+
print(f"來到{LOCATIONS[location_id]["name"]}")
|
| 37 |
+
print(f"現場描述{LOCATIONS[location_id]["scene"]}")
|
| 38 |
+
# TODO 3:線索尚未取得時才 append 到 evidence_bag。
|
| 39 |
+
if LOCATIONS[location_id]["evidence"] not in evidence_bag:
|
| 40 |
+
evidence_bag.append(location_id)
|
| 41 |
+
print(f" {LOCATIONS[location_id]["evidence"]}")
|
| 42 |
+
#print("這個調查功能還沒完成。")
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def show_evidence():
|
| 46 |
+
"""列出目前取得的所有證物。"""
|
| 47 |
+
# TODO 4:沒有證物時顯示提示;否則以 1 開始編號列出。
|
| 48 |
+
print("證物袋功能還沒完成。")
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
def make_deduction():
|
| 52 |
+
"""取得足夠證物後,讓玩家選擇真相。"""
|
| 53 |
+
if len(evidence_bag) < 3:
|
| 54 |
+
print(f"證物不足:目前 {len(evidence_bag)}/3。再去調查吧!")
|
| 55 |
+
return False
|
| 56 |
+
|
| 57 |
+
print("\n哪一個說法最符合所有證物?")
|
| 58 |
+
print("1. 晚餐很臭,到進馬桶裡")
|
| 59 |
+
print("2. 晚餐太好吃,吃到馬桶的屎")
|
| 60 |
+
print("3. 弟弟吃到睡著變成dinner")
|
| 61 |
+
answer = input("你的推理:").strip()
|
| 62 |
+
|
| 63 |
+
# TODO 5(Checkpoint C):判斷答案,正確時回傳 True。
|
| 64 |
+
print("推理判定還沒完成。")
|
| 65 |
+
return False
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
def show_menu():
|
| 69 |
+
print(f"\n=== 校園謎案調查局:{CASE_TITLE} ===")
|
| 70 |
+
print(f"1. {LOCATIONS["1"]["name"]}")
|
| 71 |
+
print(f"2. {LOCATIONS["2"]["name"]}")
|
| 72 |
+
print(f"3. {LOCATIONS["3"]["name"]}")
|
| 73 |
+
print("4. 查看證物袋")
|
| 74 |
+
print("5. 提出推理")
|
| 75 |
+
print("6. 離開")
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
def main():
|
| 79 |
+
print("午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?")
|
| 80 |
+
|
| 81 |
+
while True:
|
| 82 |
+
show_menu()
|
| 83 |
+
choice = input("請選擇:").strip()
|
| 84 |
+
|
| 85 |
+
if choice in LOCATIONS:
|
| 86 |
+
investigate(choice)
|
| 87 |
+
elif choice == "4":
|
| 88 |
+
show_evidence()
|
| 89 |
+
elif choice == "5":
|
| 90 |
+
if make_deduction():
|
| 91 |
+
break
|
| 92 |
+
elif choice == "6":
|
| 93 |
+
print("案件暫停。證物袋已交回調查局。")
|
| 94 |
+
break
|
| 95 |
+
else:
|
| 96 |
+
print("請輸入 1~6。")
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
if __name__ == "__main__":
|
| 100 |
+
main()
|
projects/2026Fall進階專題/林昭廷/week02_校園謎案調查局/case_data.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"title": "消失的校徽",
|
| 3 |
+
"intro": "午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?",
|
| 4 |
+
"locations": {
|
| 5 |
+
"1": {
|
| 6 |
+
"name": "六年一班教室",
|
| 7 |
+
"scene": "展示櫃半開,窗戶也沒有關好。",
|
| 8 |
+
"evidence": {
|
| 9 |
+
"id": "blue_fiber",
|
| 10 |
+
"name": "窗框上的藍色纖維",
|
| 11 |
+
"detail": "纖維顏色和清潔推車的布套相同。"
|
| 12 |
+
}
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "操場司令台",
|
| 16 |
+
"scene": "地面剛拖過,留下一道彎向圖書館的輪痕。",
|
| 17 |
+
"evidence": {
|
| 18 |
+
"id": "wheel_track",
|
| 19 |
+
"name": "沾著亮粉的推車輪痕",
|
| 20 |
+
"detail": "亮粉和展示櫃內的裝飾相同。"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"3": {
|
| 24 |
+
"name": "圖書館",
|
| 25 |
+
"scene": "清潔推車停在書架旁,後方似乎有東西反光。",
|
| 26 |
+
"requires": ["blue_fiber", "wheel_track"],
|
| 27 |
+
"locked_text": "你看見推車,卻還不知道該檢查哪裡。也許要先找出它的移動路線。",
|
| 28 |
+
"evidence": {
|
| 29 |
+
"id": "badge",
|
| 30 |
+
"name": "卡在推車後方的校徽",
|
| 31 |
+
"detail": "校徽沒有損壞,背面黏著一小段藍色纖維。"
|
| 32 |
+
}
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
"conclusions": {
|
| 36 |
+
"1": "有同學故意把校徽藏在圖書館",
|
| 37 |
+
"2": "風吹起校徽,清潔推車不小心把它帶到圖書館",
|
| 38 |
+
"3": "校徽從一開始就放在圖書館"
|
| 39 |
+
},
|
| 40 |
+
"correct_answer": "2",
|
| 41 |
+
"success": "推理正確!風把校徽吹到布套上,推車經過教室後又將它帶到圖書館。這是一場意外。"
|
| 42 |
+
}
|
projects/2026Fall進階專題/林昭廷/week02_校園謎案調查局/main.py
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Week 2:校園謎案調查局 Starter。
|
| 2 |
+
|
| 3 |
+
先完成 TODO 1~4。程式必須能反覆探索、收集線索、查看證物並提出推理。
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
CASE_TITLE = "18:35的約定"
|
| 7 |
+
|
| 8 |
+
LOCATIONS = {
|
| 9 |
+
"1": {
|
| 10 |
+
"name": "雨夜咖啡館",
|
| 11 |
+
"scene": "靠窗的07號桌上放著一個沒有署名的牛皮紙袋,店內已經準備打烊。",
|
| 12 |
+
"evidence": "紙袋裡的小紙條寫著「不要找我,去找星期三」,旁邊還有一把刻著B-03的舊鑰匙,咖啡收據顯示18:35,但監視器紀錄中18:35沒有任何人坐在07號桌。"
|
| 13 |
+
},
|
| 14 |
+
|
| 15 |
+
"2":{
|
| 16 |
+
"name": "舊圖書館",
|
| 17 |
+
"scene": "07號書架上的《消失的房間》沒有借閱紀錄,書頁中夾著一張泛黃的車票。",
|
| 18 |
+
"evidence": "書中被鉛筆圈起「鐘、北、三」三個字,車票日期正好是星期三,圖書館的舊平面圖上,北側曾經存在一個B-03區域,而鑰匙上的編號也正是B-03。"
|
| 19 |
+
},
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
"3": {
|
| 23 |
+
"name": "老鐘樓",
|
| 24 |
+
"scene": "鐘樓的大鐘停在18:35,地下室的現有地圖只有B-01和B-02,卻找不到B-03。",
|
| 25 |
+
"evidence": "根據舊平面圖,B-03其實代表地下第三層,而牆後藏著一個沒有標記的暗門,暗門後找到三封不同日期的信,三封信分別對應咖啡館、圖書館與鐘樓,最後一封揭露三個地方其實是一個人留下的三段記憶。"
|
| 26 |
+
}
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
evidence_bag = []
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def investigate(location_id):
|
| 33 |
+
"""調查地點並將新線索放入證物袋。"""
|
| 34 |
+
# TODO 1:確認 location_id 是否存在於 LOCATIONS。
|
| 35 |
+
if location_id not in LOCATIONS:
|
| 36 |
+
print("錯誤編號,沒這個地點")
|
| 37 |
+
return
|
| 38 |
+
# TODO 2:顯示地點名稱與現場描述。
|
| 39 |
+
print(f"你來到了{LOCATIONS[location_id]['name']}")
|
| 40 |
+
print(f"現場描述:{LOCATIONS[location_id]['scene']}")
|
| 41 |
+
# TODO 3:線索尚未取得時才 append 到 evidence_bag。
|
| 42 |
+
if LOCATIONS[location_id]["evidence"] not in evidence_bag:
|
| 43 |
+
evidence_bag.append(location_id)
|
| 44 |
+
print(f"獲得了{LOCATIONS[location_id]["evidence"]}")
|
| 45 |
+
#print("這個調查功能還沒完成。")
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
def show_evidence():
|
| 49 |
+
"""列出目前取得的所有證物。"""
|
| 50 |
+
# TODO 4:沒有證物時顯示提示;否則以 1 開始編號列出。
|
| 51 |
+
print("證物袋功能還沒完成。")
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
def make_deduction():
|
| 55 |
+
"""取得足夠證物後,讓玩家選擇真相。"""
|
| 56 |
+
if len(evidence_bag) < 3:
|
| 57 |
+
print(f"證物不足:目前 {len(evidence_bag)}/3。再去調查吧!")
|
| 58 |
+
return False
|
| 59 |
+
|
| 60 |
+
print("\n哪一個說法最符合所有證物?")
|
| 61 |
+
print("1. 有同學故意把校徽藏在圖書館")
|
| 62 |
+
print("2. 風吹起校徽,清潔推車不小心把它帶到圖書館")
|
| 63 |
+
print("3. 校徽從一開始就放在圖書館")
|
| 64 |
+
answer = input("你的推理:").strip()
|
| 65 |
+
|
| 66 |
+
# TODO 5(Checkpoint C):判斷答案,正確時回傳 True。
|
| 67 |
+
print("推理判定還沒完成。")
|
| 68 |
+
return False
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
def show_menu():
|
| 72 |
+
print(f"\n=== 校園謎案調查局:{CASE_TITLE} ===")
|
| 73 |
+
print(f"1. 調查{LOCATIONS["1"]["name"]}")
|
| 74 |
+
print(f"2. 調查{LOCATIONS["2"]["name"]}")
|
| 75 |
+
print(f"3. 調查{LOCATIONS["3"]["name"]}")
|
| 76 |
+
print("4. 查看證物袋")
|
| 77 |
+
print("5. 提出推理")
|
| 78 |
+
print("6. 離開")
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
def main():
|
| 82 |
+
print("午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?")
|
| 83 |
+
|
| 84 |
+
while True:
|
| 85 |
+
show_menu()
|
| 86 |
+
choice = input("請選擇:").strip()
|
| 87 |
+
|
| 88 |
+
if choice in LOCATIONS:
|
| 89 |
+
investigate(choice)
|
| 90 |
+
elif choice == "4":
|
| 91 |
+
show_evidence()
|
| 92 |
+
elif choice == "5":
|
| 93 |
+
if make_deduction():
|
| 94 |
+
break
|
| 95 |
+
elif choice == "6":
|
| 96 |
+
print("案件暫停。證物袋已交回調查局。")
|
| 97 |
+
break
|
| 98 |
+
else:
|
| 99 |
+
print("請輸入 1~6。")
|
| 100 |
+
|
| 101 |
+
|
| 102 |
+
if __name__ == "__main__":
|
| 103 |
+
main()
|
projects/2026Fall進階專題/游允樂/week02_校園謎案調查局/case_data.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"title": "消失的校徽",
|
| 3 |
+
"intro": "午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?",
|
| 4 |
+
"locations": {
|
| 5 |
+
"1": {
|
| 6 |
+
"name": "六年一班教室",
|
| 7 |
+
"scene": "展示櫃半開,窗戶也沒有關好。",
|
| 8 |
+
"evidence": {
|
| 9 |
+
"id": "blue_fiber",
|
| 10 |
+
"name": "窗框上的藍色纖維",
|
| 11 |
+
"detail": "纖維顏色和清潔推車的布套相同。"
|
| 12 |
+
}
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "操場司令台",
|
| 16 |
+
"scene": "地面剛拖過,留下一道彎向圖書館的輪痕。",
|
| 17 |
+
"evidence": {
|
| 18 |
+
"id": "wheel_track",
|
| 19 |
+
"name": "沾著亮粉的推車輪痕",
|
| 20 |
+
"detail": "亮粉和展示櫃內的裝飾相同。"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"3": {
|
| 24 |
+
"name": "圖書館",
|
| 25 |
+
"scene": "清潔推車停在書架旁,後方似乎有東西反光。",
|
| 26 |
+
"requires": ["blue_fiber", "wheel_track"],
|
| 27 |
+
"locked_text": "你看見推車,卻還不知道該檢查哪裡。也許要先找出它的移動路線。",
|
| 28 |
+
"evidence": {
|
| 29 |
+
"id": "badge",
|
| 30 |
+
"name": "卡在推車後方的校徽",
|
| 31 |
+
"detail": "校徽沒有損壞,背面黏著一小段藍色纖維。"
|
| 32 |
+
}
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
"conclusions": {
|
| 36 |
+
"1": "有同學故意把校徽藏在圖書館",
|
| 37 |
+
"2": "風吹起校徽,清潔推車不小心把它帶到圖書館",
|
| 38 |
+
"3": "校徽從一開始就放在圖書館"
|
| 39 |
+
},
|
| 40 |
+
"correct_answer": "2",
|
| 41 |
+
"success": "推理正確!風把校徽吹到布套上,推車經過教室後又將它帶到圖書館。這是一場意外。"
|
| 42 |
+
}
|
projects/2026Fall進階專題/游允樂/week02_校園謎案調查局/main.py
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Week 2:校園謎案調查局 Starter。
|
| 2 |
+
|
| 3 |
+
先完成 TODO 1~4。程式必須能反覆探索、收集線索、查看證物並提出推理。
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
CASE_TITLE = "凌晨三點的病房"
|
| 7 |
+
|
| 8 |
+
LOCATIONS = {
|
| 9 |
+
"1": {
|
| 10 |
+
"name": "凌晨三點的病房",
|
| 11 |
+
"scene": '電線並不是連到牆上的插座。而是穿過牆壁。',
|
| 12 |
+
"evidence": "五年前的醫療紀錄。桌上還有一本筆記本",
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "密室",
|
| 16 |
+
"scene": "筆記本寫:如果有人發現這個房間,代表事情終於藏不住了。",
|
| 17 |
+
"evidence": "消失的米血:他的名字從醫院大部分的舊資料裡消失了。",
|
| 18 |
+
},
|
| 19 |
+
"3": {
|
| 20 |
+
"name": "密室裡的秘密",
|
| 21 |
+
"scene": "米0死亡原因:心臟驟停。",
|
| 22 |
+
"evidence": "護理站的鈴聲突然響起",
|
| 23 |
+
},
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
evidence_bag = []
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def investigate(location_id):
|
| 30 |
+
"""調查地點並將新線索放入證物袋。"""
|
| 31 |
+
# TODO 1:確認 location_id 是否存在於 LOCATIONS。
|
| 32 |
+
if location_id not in LOCATIONS:
|
| 33 |
+
print(f"錯誤編號,沒這個地點")
|
| 34 |
+
return
|
| 35 |
+
# TODO 2:顯示地點名稱與現場描述。
|
| 36 |
+
print(f"你來到了{LOCATIONS[location_id]["name"]}")
|
| 37 |
+
print(f'現場描述:{LOCATIONS[location_id]["scene"]}')
|
| 38 |
+
# TODO 3:線索尚未取得時才 append 到 evidence_bag。
|
| 39 |
+
if LOCATIONS[location_id]["evidence"] not in evidence_bag:
|
| 40 |
+
evidence_bag.append(location_id)
|
| 41 |
+
print(f'取得了{LOCATIONS[location_id]['evidence']}')
|
| 42 |
+
|
| 43 |
+
print("這個調查功能還沒完成。")
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
def show_evidence():
|
| 47 |
+
"""列出目前取得的所有證物。"""
|
| 48 |
+
# TODO 4:沒有證物時顯示提示;否則以 1 開始編號列出。
|
| 49 |
+
print("證物袋功能還沒完成。")
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
def make_deduction():
|
| 53 |
+
"""取得足夠證物後,讓玩家選擇真相。"""
|
| 54 |
+
if len(evidence_bag) < 3:
|
| 55 |
+
print(f"證物不足:目前 {len(evidence_bag)}/3。再去調查吧!")
|
| 56 |
+
return False
|
| 57 |
+
|
| 58 |
+
print("\n哪一個說法最符合所有證物?")
|
| 59 |
+
print("1. 有人把米0殺了")
|
| 60 |
+
print("2. 米0自殺了")
|
| 61 |
+
print("3. 他被鬼帶走了")
|
| 62 |
+
answer = input("你的推理:").strip()
|
| 63 |
+
|
| 64 |
+
# TODO 5(Checkpoint C):判斷答案,正確時回傳 True。
|
| 65 |
+
print("推理判定還沒完成。")
|
| 66 |
+
return False
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def show_menu():# 凌晨三點的病房
|
| 70 |
+
print(f"\n=== :{CASE_TITLE} ===")
|
| 71 |
+
print(f"1. 調查{LOCATIONS["1"]["name"]}")
|
| 72 |
+
print(f"2. 調查{LOCATIONS["2"]["name"]}")
|
| 73 |
+
print(f"3. 調查{LOCATIONS["3"]["name"]}")
|
| 74 |
+
print("4. 查看證物袋")
|
| 75 |
+
print("5. 提出推理")
|
| 76 |
+
print("6. 離開")
|
| 77 |
+
|
| 78 |
+
print(f"\n=== :{CASE_TITLE} ===")
|
| 79 |
+
print("1. 有人把米0殺了")
|
| 80 |
+
print("2. 米0自殺了")
|
| 81 |
+
print("3. 他被鬼帶走了")
|
| 82 |
+
|
| 83 |
+
def main():
|
| 84 |
+
print("現在是6:07分,你能破案嗎?")
|
| 85 |
+
|
| 86 |
+
while True:
|
| 87 |
+
show_menu()
|
| 88 |
+
choice = input("請選擇:").strip()
|
| 89 |
+
|
| 90 |
+
if choice in LOCATIONS:
|
| 91 |
+
investigate(choice)
|
| 92 |
+
elif choice == "4":
|
| 93 |
+
show_evidence()
|
| 94 |
+
elif choice == "5":
|
| 95 |
+
if make_deduction():
|
| 96 |
+
break
|
| 97 |
+
elif choice == "6":
|
| 98 |
+
print("案件暫停。證物袋已交回調查局。")
|
| 99 |
+
break
|
| 100 |
+
else:
|
| 101 |
+
print("請輸入 1~6。")
|
| 102 |
+
|
| 103 |
+
|
| 104 |
+
if __name__ == "__main__":
|
| 105 |
+
main()
|
projects/2026Fall進階專題/王郁嘉/week02_校園謎案調查局/case_data.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"title": "消失的校徽",
|
| 3 |
+
"intro": "午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?",
|
| 4 |
+
"locations": {
|
| 5 |
+
"1": {
|
| 6 |
+
"name": "六年一班教室",
|
| 7 |
+
"scene": "展示櫃半開,窗戶也沒有關好。",
|
| 8 |
+
"evidence": {
|
| 9 |
+
"id": "blue_fiber",
|
| 10 |
+
"name": "窗框上的藍色纖維",
|
| 11 |
+
"detail": "纖維顏色和清潔推車的布套相同。"
|
| 12 |
+
}
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "操場司令台",
|
| 16 |
+
"scene": "地面剛拖過,留下一道彎向圖書館的輪痕。",
|
| 17 |
+
"evidence": {
|
| 18 |
+
"id": "wheel_track",
|
| 19 |
+
"name": "沾著亮粉的推車輪痕",
|
| 20 |
+
"detail": "亮粉和展示櫃內的裝飾相同。"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"3": {
|
| 24 |
+
"name": "圖書館",
|
| 25 |
+
"scene": "清潔推車停在書架旁,後方似乎有東西反光。",
|
| 26 |
+
"requires": ["blue_fiber", "wheel_track"],
|
| 27 |
+
"locked_text": "你看見推車,卻還不知道該檢查哪裡。也許要先找出它的移動路線。",
|
| 28 |
+
"evidence": {
|
| 29 |
+
"id": "badge",
|
| 30 |
+
"name": "卡在推車後方的校徽",
|
| 31 |
+
"detail": "校徽沒有損壞,背面黏著一小段藍色纖維。"
|
| 32 |
+
}
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
"conclusions": {
|
| 36 |
+
"1": "有同學故意把校徽藏在圖書館",
|
| 37 |
+
"2": "風吹起校徽,清潔推車不小心把它帶到圖書館",
|
| 38 |
+
"3": "校徽從一開始就放在圖書館"
|
| 39 |
+
},
|
| 40 |
+
"correct_answer": "2",
|
| 41 |
+
"success": "推理正確!風把校徽吹到布套上,推車經過教室後又將它帶到圖書館。這是一場意外。"
|
| 42 |
+
}
|
projects/2026Fall進階專題/王郁嘉/week02_校園謎案調查局/main.py
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Week 2:校園謎案調查局 Starter。
|
| 2 |
+
|
| 3 |
+
先完成 TODO 1~4。程式必須能反覆探索、收集線索、查看證物並提出推理。
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
CASE_TITLE = "神鞋失竊案"
|
| 7 |
+
|
| 8 |
+
LOCATIONS = {
|
| 9 |
+
"1": {
|
| 10 |
+
"name": "NBA邁阿密熱火主場球員休息室",
|
| 11 |
+
"scene": "LeBron的球衣展示櫃半開,後方通往球員通道的通風窗也沒有關好。",
|
| 12 |
+
"evidence": "通風窗框上勾到了某件復古球衣的藍色纖維",
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "NBA邁阿密熱火主場球場中央",
|
| 16 |
+
"scene": "木地板剛用球場洗地機拖過,卻留下一道彎向球隊戰術分析室的輪痕。",
|
| 17 |
+
"evidence": "沾著中場啦啦隊表演亮粉的裝備推車輪痕",
|
| 18 |
+
},
|
| 19 |
+
"3": {
|
| 20 |
+
"name": "NBA邁阿密熱火主場球隊戰術分析室",
|
| 21 |
+
"scene": "一台戰術板清潔推車停在錄影帶書架旁,後方有螢光粉紅色的東西反光。",
|
| 22 |
+
"evidence": "卡在推車後方的失竊 Nike 籃球鞋與 Ray Gun 的球隊胸章",
|
| 23 |
+
},
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
evidence_bag = []
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def investigate(location_id):
|
| 30 |
+
"""調查地點並將新線索放入證物袋。"""
|
| 31 |
+
# TODO 1:確認 location_id 是否存在於 LOCATIONS。
|
| 32 |
+
if location_id not in LOCATIONS:
|
| 33 |
+
print("錯誤編號,沒這個地店")
|
| 34 |
+
return
|
| 35 |
+
# TODO 2:顯示地點名稱與現場描述。
|
| 36 |
+
print(f"牛來到了{LOCATIONS[location_id]["name"]}")
|
| 37 |
+
print(f"現場描述{LOCATIONS[location_id]["scene"]}")
|
| 38 |
+
# TODO 3:線索尚未取得時才 append 到 evidence_bag。
|
| 39 |
+
if LOCATIONS[location_id]["evidence"] not in evidence_bag:
|
| 40 |
+
evidence_bag.append(location_id)
|
| 41 |
+
print(f"取得了{LOCATIONS[location_id]["evidence"]}")
|
| 42 |
+
#print("這個調查功能還沒完成。")
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def show_evidence():
|
| 46 |
+
"""列出目前取得的所有證物。"""
|
| 47 |
+
# TODO 4:沒有證物時顯示提示;否則以 1 開始編號列出。
|
| 48 |
+
print("證物袋功能還沒完成。")
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
def make_deduction():
|
| 52 |
+
"""取得足夠證物後,讓玩家選擇真相。"""
|
| 53 |
+
if len(evidence_bag) < 3:
|
| 54 |
+
print(f"證物不足:目前 {len(evidence_bag)}/3。再去調查吧!")
|
| 55 |
+
return False
|
| 56 |
+
|
| 57 |
+
print("\n哪一個說法最符合所有證物?")
|
| 58 |
+
print("1. 有同學故意把校徽藏在圖書館")
|
| 59 |
+
print("2. 風吹起校徽,清潔推車不小心把它帶到圖書館")
|
| 60 |
+
print("3. 校徽從一開始就放在圖書館")
|
| 61 |
+
answer = input("你的推理:").strip()
|
| 62 |
+
|
| 63 |
+
# TODO 5(Checkpoint C):判斷答案,正確時回傳 True。
|
| 64 |
+
print("推理判定還沒完成。")
|
| 65 |
+
return False
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
def show_menu():
|
| 69 |
+
print(f"\n=== 校園謎案調查局:{CASE_TITLE} ===")
|
| 70 |
+
print(f"1. 調查{LOCATIONS["1"]["name"]}")
|
| 71 |
+
print(f"2. 調查{LOCATIONS["2"]["name"]}")
|
| 72 |
+
print(f"3. 調查{LOCATIONS["3"]["name"]}")
|
| 73 |
+
print("4. 查看證物袋")
|
| 74 |
+
print("5. 提出推理")
|
| 75 |
+
print("6. 離開")
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
def main():
|
| 79 |
+
print("午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?")
|
| 80 |
+
|
| 81 |
+
while True:
|
| 82 |
+
show_menu()
|
| 83 |
+
choice = input("請選擇:").strip()
|
| 84 |
+
|
| 85 |
+
if choice in LOCATIONS:
|
| 86 |
+
investigate(choice)
|
| 87 |
+
elif choice == "4":
|
| 88 |
+
show_evidence()
|
| 89 |
+
elif choice == "5":
|
| 90 |
+
if make_deduction():
|
| 91 |
+
break
|
| 92 |
+
elif choice == "6":
|
| 93 |
+
print("案件暫停。證物袋已交回調查局。")
|
| 94 |
+
break
|
| 95 |
+
else:
|
| 96 |
+
print("請輸入 1~6。")
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
if __name__ == "__main__":
|
| 100 |
+
main()
|
projects/2026Fall進階專題/陳英赫/week02_校園謎案調查局/case_data.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"title": "消失的校徽",
|
| 3 |
+
"intro": "午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?",
|
| 4 |
+
"locations": {
|
| 5 |
+
"1": {
|
| 6 |
+
"name": "六年一班教室",
|
| 7 |
+
"scene": "展示櫃半開,窗戶也沒有關好。",
|
| 8 |
+
"evidence": {
|
| 9 |
+
"id": "blue_fiber",
|
| 10 |
+
"name": "窗框上的藍色纖維",
|
| 11 |
+
"detail": "纖維顏色和清潔推車的布套相同。"
|
| 12 |
+
}
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "操場司令台",
|
| 16 |
+
"scene": "地面剛拖過,留下一道彎向圖書館的輪痕。",
|
| 17 |
+
"evidence": {
|
| 18 |
+
"id": "wheel_track",
|
| 19 |
+
"name": "沾著亮粉的推車輪痕",
|
| 20 |
+
"detail": "亮粉和展示櫃內的裝飾相同。"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"3": {
|
| 24 |
+
"name": "圖書館",
|
| 25 |
+
"scene": "清潔推車停在書架旁,後方似乎有東西反光。",
|
| 26 |
+
"requires": ["blue_fiber", "wheel_track"],
|
| 27 |
+
"locked_text": "你看見推車,卻還不知道該檢查哪裡。也許要先找出它的移動路線。",
|
| 28 |
+
"evidence": {
|
| 29 |
+
"id": "badge",
|
| 30 |
+
"name": "卡在推車後方的校徽",
|
| 31 |
+
"detail": "校徽沒有損壞,背面黏著一小段藍色纖維。"
|
| 32 |
+
}
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
"conclusions": {
|
| 36 |
+
"1": "有同學故意把校徽藏在圖書館",
|
| 37 |
+
"2": "風吹起校徽,清潔推車不小心把它帶到圖書館",
|
| 38 |
+
"3": "校徽從一開始就放在圖書館"
|
| 39 |
+
},
|
| 40 |
+
"correct_answer": "2",
|
| 41 |
+
"success": "推理正確!風把校徽吹到布套上,推車經過教室後又將它帶到圖書館。這是一場意外。"
|
| 42 |
+
}
|
projects/2026Fall進階專題/陳英赫/week02_校園謎案調查局/main.py
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Week 2:校園謎案調查局 Starter。
|
| 2 |
+
|
| 3 |
+
先完成 TODO 1~4。程式必須能反覆探索、收集線索、查看證物並提出推理。
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
CASE_TITLE = "消失的校徽"
|
| 7 |
+
|
| 8 |
+
LOCATIONS = {
|
| 9 |
+
"1": {
|
| 10 |
+
"name": "六年一班教室",
|
| 11 |
+
"scene": "展示櫃半開,窗戶也沒有關好。",
|
| 12 |
+
"evidence": "窗框上的藍色纖維",
|
| 13 |
+
},
|
| 14 |
+
"2": {
|
| 15 |
+
"name": "操場司令台",
|
| 16 |
+
"scene": "地面剛拖過,留下一道彎向圖書館的輪痕。",
|
| 17 |
+
"evidence": "沾著亮粉的推車輪痕",
|
| 18 |
+
},
|
| 19 |
+
"3": {
|
| 20 |
+
"name": "圖書館",
|
| 21 |
+
"scene": "清潔推車停在書架旁,後方似乎有東西反光。",
|
| 22 |
+
"evidence": "卡在推車後方的校徽",
|
| 23 |
+
},
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
evidence_bag = []
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def investigate(location_id):
|
| 30 |
+
"""調查地點並將新線索放入證物袋。"""
|
| 31 |
+
# TODO 1:確認 location_id 是否存在於 LOCATIONS。
|
| 32 |
+
if location_id not in LOCATIONS:
|
| 33 |
+
print("錯誤編號")
|
| 34 |
+
return
|
| 35 |
+
# TODO 2:顯示地點名稱與現場描述。
|
| 36 |
+
print(f"你來到了{LOCATIONS[locition_id]["name"]}")
|
| 37 |
+
print(f"現場描述:{LOCATIONS[locition_id]["scene"]}")
|
| 38 |
+
# TODO 3:線索尚未取得時才 append 到 evidence_bag。
|
| 39 |
+
if LOCATIONS[location_id]["evidence"] not in evidence_bag:
|
| 40 |
+
evidence_bag.append(location_id)
|
| 41 |
+
print(f"取得了{LOCATIONS[location_id]["evidence"]}")
|
| 42 |
+
print("這個調查功能還沒完成。")
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def show_evidence():
|
| 46 |
+
"""列出目前取得的所有證物。"""
|
| 47 |
+
# TODO 4:沒有證物時顯示提示;否則以 1 開始編號列出。
|
| 48 |
+
print("證物袋功能還沒完成。")
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
def make_deduction():
|
| 52 |
+
"""取得足夠證物後,讓玩家選擇真相。"""
|
| 53 |
+
if len(evidence_bag) < 3:
|
| 54 |
+
print(f"證物不足:目前 {len(evidence_bag)}/3。再去調查吧!")
|
| 55 |
+
return False
|
| 56 |
+
|
| 57 |
+
print("\n哪一個說法最符合所有證物?")
|
| 58 |
+
print("1. 有同學故意把校徽藏在圖書館")
|
| 59 |
+
print("2. 風吹起校徽,清潔推車不小心把它帶到圖書館")
|
| 60 |
+
print("3. 校徽從一開始就放在圖書館")
|
| 61 |
+
answer = input("你的推理:").strip()
|
| 62 |
+
|
| 63 |
+
# TODO 5(Checkpoint C):判斷答案,正確時回傳 True。
|
| 64 |
+
print("推理判定還沒完成。")
|
| 65 |
+
return False
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
def show_menu():
|
| 69 |
+
print(f"\n=== 校園謎案調查局:{CASE_TITLE} ===")
|
| 70 |
+
print(f"1. 調查{LOCATONS["1"]["name"]")
|
| 71 |
+
print(f"2. 調查{LOCATONS["2"]["name"]")
|
| 72 |
+
print(f"3. 調查{LOCATONS["3"]["name"]")
|
| 73 |
+
print("4. 查看證物袋")
|
| 74 |
+
print("5. 提出推理")
|
| 75 |
+
print("6. 離開")
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
def main():
|
| 79 |
+
print("午休結束後,校慶展示櫃裡的校徽消失了。你能找出真相嗎?")
|
| 80 |
+
|
| 81 |
+
while True:
|
| 82 |
+
show_menu()
|
| 83 |
+
choice = input("請選擇:").strip()
|
| 84 |
+
|
| 85 |
+
if choice in LOCATIONS:
|
| 86 |
+
investigate(choice)
|
| 87 |
+
elif choice == "4":
|
| 88 |
+
show_evidence()
|
| 89 |
+
elif choice == "5":
|
| 90 |
+
if make_deduction():
|
| 91 |
+
break
|
| 92 |
+
elif choice == "6":
|
| 93 |
+
print("案件暫停。證物袋已交回調查局。")
|
| 94 |
+
break
|
| 95 |
+
else:
|
| 96 |
+
print("請輸入 1~6。")
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
if __name__ == "__main__":
|
| 100 |
+
main()
|