import time import random class EscapeRoomGame: def __init__(self): self.current_room = "entrance" self.inventory = [] self.solved_puzzles = set() self.hints_remaining = 3 self.game_start_time = None def clear_screen(self): """清空螢幕(簡單實現)""" print("\n" * 50) def slow_print(self, text, delay=0.03): """慢速打印文字,增加沉浸感""" for char in text: print(char, end='', flush=True) time.sleep(delay) print() def show_title(self): """顯示遊戲標題""" title = """ ╔══════════════════════════════════════╗ ║ 時 空 密 室 ║ ║ Escape the Time Room ║ ╚══════════════════════════════════════╝ """ print(title) def introduction(self): """遊戲介紹""" self.clear_screen() self.show_title() self.slow_print("你是一名時空探險家,在一次實驗中意外被困在了時空裂縫中...") time.sleep(1) self.slow_print("四周環繞著四個神秘的房間,每個房間都代表一個不同的時代。") time.sleep(1) self.slow_print("只有解開所有房間的謎題,才能修復時空裝置,回到現實世界。") time.sleep(1) input("\n按 Enter 鍵開始你的冒險...") def show_inventory(self): """顯示物品欄""" if self.inventory: print(f"\n🎒 你的物品:{', '.join(self.inventory)}") else: print("\n🎒 你的物品欄是空的。") def show_status(self): """顯示遊戲狀態""" print(f"\n💡 提示機會剩餘:{self.hints_remaining}") print(f"✅ 已解開謎題:{len(self.solved_puzzles)}/4") def get_hint(self, hint_text): """獲取提示""" if self.hints_remaining > 0: self.hints_remaining -= 1 print(f"\n🔍 提示:{hint_text}") return True else: print("\n❌ 你已經用完了所有提示機會!") return False def puzzle_ancient_egypt(self): """古埃及謎題 - 象形文字解碼""" if "ancient_egypt" in self.solved_puzzles: print("\n你已經解開了這個房間的謎題。") return True self.clear_screen() print("🏛️ 古埃及密室") print("=" * 40) print("你站在一座古老的金字塔內部,牆上刻滿了神秘的象形文字。") print("在房間中央有一個石製機關,上面有四個凹槽,需要放入正確的符號。") # 象形文字對應表(簡化版) hieroglyphs = { "☀️": "SUN", "🌙": "MOON", "👑": "KING", "🐍": "SNAKE", "🦅": "EAGLE", "🌊": "WATER", "🔥": "FIRE", "⚔️": "SWORD" } # 隨機選擇4個符號作為謎題 puzzle_symbols = random.sample(list(hieroglyphs.keys()), 4) correct_answer = [hieroglyphs[sym] for sym in puzzle_symbols] print(f"\n牆上的象形文字序列:{' '.join(puzzle_symbols)}") print("\n石製機關上有四個位置,需要輸入對應的英文單詞。") print("可用的詞彙:SUN, MOON, KING, SNAKE, EAGLE, WATER, FIRE, SWORD") attempts = 3 while attempts > 0: print(f"\n還剩 {attempts} 次機會") user_input = input("請輸入四個單詞(用空格分隔):").upper().strip() user_words = user_input.split() if len(user_words) != 4: print("❌ 請輸入恰好四個單詞!") attempts -= 1 continue if user_words == correct_answer: print("\n🎉 石門緩緩打開!你成功解開了古埃及的謎題!") print("你獲得了一塊閃爍著藍光的時空碎片!") self.inventory.append("時空碎片(藍)") self.solved_puzzles.add("ancient_egypt") input("\n按 Enter 繼續...") return True else: attempts -= 1 if attempts > 0: print("❌ 答案不正確,機關沒有反應...") if self.hints_remaining > 0: hint_choice = input("需要提示嗎?(y/n):").lower() if hint_choice == 'y': self.get_hint(f"第一個符號代表 {correct_answer[0]}") print(f"\n💀 機關發出刺耳的聲音,房間開始崩塌...") print(f"正確答案應該是:{' '.join(correct_answer)}") return False def puzzle_medieval_castle(self): """中世紀城堡謎題 - 騎士巡邏問題""" if "medieval_castle" in self.solved_puzzles: print("\n你已經解開了這個房間的謎題。") return True self.clear_screen() print("🏰 中世紀城堡") print("=" * 40) print("你來到了一座陰森的中世紀城堡,城堡大廳的地板上刻著一個3x3的棋盤。") print("一位幽靈騎士告訴你:'只有按照騎士的移動方式走遍所有格子,才能打開密道。'") # 騎士巡邏問題簡化版 # 正確路徑:從(0,0)開始的騎士巡邏 correct_path = [(0,0), (1,2), (2,0), (0,1), (1,0), (2,2), (0,2), (2,1), (1,1)] correct_sequence = "183672945" # 對應數字鍵盤布局 print("\n棋盤布局(數字鍵盤格式):") print("7 8 9") print("4 5 6") print("1 2 3") print("\n騎士移動規則:L形移動(2格直線+1格垂直)") print("你需要輸入一個9位數字序列,表示騎士訪問格子的順序。") attempts = 3 while attempts > 0: print(f"\n還剩 {attempts} 次機會") user_input = input("請輸入9位數字序列:").strip() if len(user_input) != 9 or not user_input.isdigit(): print("❌ 請輸入恰好9位數字!") attempts -= 1 continue if user_input == correct_sequence: print("\n🎉 幽靈騎士向你鞠躬致敬!密道打開了!") print("你獲得了一塊閃爍著紅光的時空碎片!") self.inventory.append("時空碎片(紅)") self.solved_puzzles.add("medieval_castle") input("\n按 Enter 繼續...") return True else: attempts -= 1 if attempts > 0: print("❌ 騎士搖了搖頭,表示路徑不正確...") if self.hints_remaining > 0: hint_choice = input("需要提示嗎?(y/n):").lower() if hint_choice == 'y': self.get_hint("起始位置是數字1的位置") print(f"\n💀 騎士變成了敵對狀態,向你衝來...") print(f"正確序列應該是:{correct_sequence}") return False def puzzle_victorian_mansion(self): """維多利亞莊園謎題 - 莫斯電碼""" if "victorian_mansion" in self.solved_puzzles: print("\n你已經解開了這個房間的謎題。") return True self.clear_screen() print("🏡 維多利亞莊園") print("=" * 40) print("你進入了一間典雅的維多利亞時代書房,桌上放著一台古老的電報機。") print("電報機不斷發出滴滴答答的聲音,似乎在傳遞某種訊息。") # 莫斯電碼謎題 morse_code = { 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..' } secret_word = "KEY" morse_message = " ".join([morse_code[char] for char in secret_word]) print(f"\n電報機傳來的訊息:{morse_message}") print("\n桌上有一本摩斯電碼對照表,但部分內容已經模糊不清。") print("你需要解碼這個訊息,找出關鍵字。") attempts = 3 while attempts > 0: print(f"\n還剩 {attempts} 次機會") user_input = input("請輸入解碼後的單詞:").upper().strip() if user_input == secret_word: print("\n🎉 電報機停止了鳴叫,書架緩緩移開,露出了一個暗格!") print("你獲得了一塊閃爍著綠光的時空碎片!") self.inventory.append("時空碎片(綠)") self.solved_puzzles.add("victorian_mansion") input("\n按 Enter 繼續...") return True else: attempts -= 1 if attempts > 0: print("❌ 電報機繼續發出雜音,似乎還不對...") if self.hints_remaining > 0: hint_choice = input("需要提示嗎?(y/n):").lower() if hint_choice == 'y': self.get_hint("這是一個3個字母的單詞,通常用來開鎖") print(f"\n💀 電報機突然爆炸,房間充滿了煙霧...") print(f"正確答案應該是:{secret_word}") return False def puzzle_future_lab(self): """未來實驗室謎題 - 二進制解碼""" if "future_lab" in self.solved_puzzles: print("\n你已經解開了這個房間的謎題。") return True self.clear_screen() print("🔬 未來實驗室") print("=" * 40) print("你穿越到了未來,站在一個高科技實驗室中。") print("牆上的全息投影顯示著一串二進制代碼,旁邊有一個數字鍵盤。") # 二進制謎題 secret_number = 2024 binary_code = bin(secret_number)[2:] # 去掉'0b'前綴 print(f"\n全息投影顯示:{binary_code}") print("\n你需要將這個二進制數轉換為十進制數,並輸入到鍵盤上。") attempts = 3 while attempts > 0: print(f"\n還剩 {attempts} 次機會") try: user_input = int(input("請輸入十進制數字:")) if user_input == secret_number: print("\n🎉 全息投影閃爍出綠色光芒!實驗室的大門打開了!") print("你獲得了一塊閃爍著紫光的時空碎片!") self.inventory.append("時空碎片(紫)") self.solved_puzzles.add("future_lab") input("\n按 Enter 繼續...") return True else: attempts -= 1 if attempts > 0: print("❌ 錯誤的數字,警報聲響起...") if self.hints_remaining > 0: hint_choice = input("需要提示嗎?(y/n):").lower() if hint_choice == 'y': self.get_hint("這是今年的年份") except ValueError: print("❌ 請輸入有效的數字!") attempts -= 1 print(f"\n💀 實驗室啟動了自毀程序...") print(f"正確答案應該是:{secret_number}") return False def final_puzzle(self): """最終謎題 - 拼合時空碎片""" if len(self.solved_puzzles) < 4: print("\n❌ 你還沒有收集齊所有的時空碎片!") return False self.clear_screen() print("🌀 時空核心") print("=" * 40) print("你回到了時空裂縫的中心,四塊時空碎片在你手中閃爍著不同的光芒。") print("你需要按照正確的順序將它們放入時空裝置中。") # 正確順序基於顏色光譜:紅、橙、黃、綠、藍、靛、紫 # 我們的碎片:藍、紅、綠、紫 # 正確順序:紅(650nm)、綠(510nm)、藍(475nm)、紫(400nm) correct_order = ["時空碎片(紅)", "時空碎片(綠)", "時空碎片(藍)", "時空碎片(紫)"] print("\n你的時空碎片:") for i, item in enumerate(self.inventory, 1): print(f"{i}. {item}") print("\n請輸入碎片的正確順序(用數字表示,例如:2 3 1 4)") attempts = 3 while attempts > 0: print(f"\n還剩 {attempts} 次機會") try: user_input = input("請輸入順序:").strip().split() if len(user_input) != 4: print("❌ 請輸入恰好4個數字!") attempts -= 1 continue user_order = [] for num in user_input: idx = int(num) - 1 if 0 <= idx < len(self.inventory): user_order.append(self.inventory[idx]) else: raise ValueError if user_order == correct_order: print("\n🎉🎉🎉") self.slow_print("四塊時空碎片完美契合,時空裝置發出耀眼的光芒!") time.sleep(1) self.slow_print("時空裂縫開始癒合,你感覺自己正在被傳送回現實世界...") time.sleep(1) self.slow_print("\n🎊 恭喜你!你成功逃脫了時空密室!") time.sleep(1) print(f"\n遊戲完成時間:{int(time.time() - self.game_start_time)} 秒") print(f"剩餘提示次數:{self.hints_remaining}") return True else: attempts -= 1 if attempts > 0: print("❌ 碎片的順序不對,時空裝置發出不穩定的能量波動...") if self.hints_remaining > 0: hint_choice = input("需要提示嗎?(y/n):").lower() if hint_choice == 'y': self.get_hint("按照可見光譜的波長從長到短排列") except (ValueError, IndexError): print("❌ 請輸入有效的數字序列!") attempts -= 1 print("\n💀 時空裝置過載爆炸,你被永遠困在了時空裂縫中...") return False def main_menu(self): """主菜單""" while True: self.clear_screen() self.show_title() print("\n📍 當前位置:時空裂縫入口") self.show_inventory() self.show_status() print("\n你可以前往以下房間:") rooms = [ ("1", "古埃及密室", "ancient_egypt" in self.solved_puzzles), ("2", "中世紀城堡", "medieval_castle" in self.solved_puzzles), ("3", "維多利亞莊園", "victorian_mansion" in self.solved_puzzles), ("4", "未來實驗室", "future_lab" in self.solved_puzzles), ("5", "時空核心", len(self.solved_puzzles) == 4) ] for key, name, solved in rooms: status = "✅ 已解開" if solved else "🔒 未解開" print(f"{key}. {name} - {status}") print("0. 退出遊戲") choice = input("\n請選擇要進入的房間:").strip() if choice == "0": print("感謝遊玩!再見!") break elif choice == "1": self.puzzle_ancient_egypt() elif choice == "2": self.puzzle_medieval_castle() elif choice == "3": self.puzzle_victorian_mansion() elif choice == "4": self.puzzle_future_lab() elif choice == "5": if self.final_puzzle(): break else: print("❌ 無效的選擇!") time.sleep(1) def play(self): """開始遊戲""" self.introduction() self.game_start_time = time.time() self.main_menu() # 運行遊戲 if __name__ == "__main__": game = EscapeRoomGame() game.play()