如何启动Python文本恐怖游戏?代码运行异常求助
文本恐怖游戏修复方案
核心问题分析
你的代码存在几个关键错误,导致游戏无法正常运行:
- 缩进错误:
while True循环后的核心游戏逻辑(房间描述、输入处理)全部在循环体外,循环仅执行Strange Room的判断逻辑,后续流程完全无法触发。 - 变量作用域问题:
rooms字典定义在house()函数内部,外部无法访问;inventory变量未初始化,且物品函数iventory拼写错误、内部字典未被调用。 - 房间信息调用错误:
current_room是字符串类型(如"Front Yard"),你尝试用current_room["name"]["text"]调用房间描述,正确方式应为rooms[current_room]["text"]。 - 物品拾取逻辑缺失:仅保留了输入询问,完全没有处理物品拾取的核心逻辑。
- 未执行关键函数:
house()函数定义后从未被调用,导致rooms字典根本不存在。 - 输入指令错误:主菜单里的方向提示写了
'forward,'(带逗号),会导致用户输入forward无法被识别。 - 结局循环问题:进入
Strange Room后未退出循环,会持续重复打印结局内容。
修正后的完整代码
def main_menu(): print("你已经在废弃小镇游荡了几天,世界末日后没什么事可做。") print("你在偏僻的居民区发现了这栋房子,看起来比其他房子完好得多,没那么破败。") print("你决定进去探索,哪怕盯着它看太久会有种奇怪的不适感。") print("你走进了前院。") print() print("欢迎来到《凶宅》。收集7件物品后进入最终房间。") print("移动请输入:'forward'、'back'、'left'、'right'") print("拾取物品请输入:'yes'或'no'") print("退出游戏请输入:'quit'") # 修正拼写错误,返回物品字典供外部调用 def inventory(): return { "前门钥匙": {"name": "前门钥匙", "description": "一把生锈的古董钥匙。"}, "切肉刀": {"name": "切肉刀", "description": "一把用来切肉的大砍刀。"}, "阁楼钥匙": {"name": "阁楼钥匙", "description": "一把银色的小钥匙。"}, "全家福": {"name": "全家福", "description": "一张照片,上面是一家三口:戴眼镜的男人、黑发女人,还有一个卷毛棕发的小女孩。"}, "艾米丽的日记": {"name": "艾米丽的日记", "description": "属于照片里小女孩的日记。里面记录了一个原本开朗但体弱的女孩,逐渐对父亲强迫她打不知名针剂感到恐惧,还有父母突然爆发的争吵。"}, "研究日志": {"name": "研究日志", "description": "艾米丽父亲的实验记录。里面写着他为了救女儿,不惜对人和动物进行诡异痛苦的实验,后期他看起来成功了,但字迹潦草显示他精神状态异常。"}, "末世报纸": {"name": "末世报纸", "description": "世界末日前后发行的报纸,将人们突然失控的暴力行为归咎于一名男子的癌症治疗实验。"} } # 返回房间字典,让外部可以正常访问 def house(): return { "前院": {"name": "前院", "right": "后院", "forward": "前门入口", "text": "你来到了前院。面前是一栋安静古朴的房子,有门廊和复古的前门。右边是分隔前后院的栅栏。"}, "后院": {"name": "后院", "left": "前院", "item": "前门钥匙", "text": "你来到了后院。这里破败得多,有个旧棚屋和一辆锈迹斑斑的卡车,油漆剥落得近乎粉色。卡车驾驶室没锁,你往里看了看。"}, "前门入口": {"name": "前门入口", "back": "前院", "right": "厨房", "left": "客厅", "forward": "楼上走廊", "text": "走进前门,你看到一个简朴的家。面前是楼梯,右边是厨房,左边是客厅。"}, "厨房": {"name": "厨房", "left": "前门入口", "item": "切肉刀", "text": "厨房一片狼藉,桌上还留着食物,仿佛这家人没打算离开。冰箱锈了,有些柜门被撬开。台面上有个刀架,插着餐具。"}, "客厅": {"name": "客厅", "right": "前门入口", "forward": "楼下卫生间", "item": "全家福", "text": "客厅很小,角落有个老式盒式电视,沙发和椅子对着电视。前方有个小走廊通向卫生间,墙上挂着照片。"}, "楼下卫生间": {"name": "楼下卫生间", "back": "客厅", "item": "阁楼钥匙", "text": "卫生间很小,只有半套卫浴设施。生锈的洗手池里有个东西闪着光。"}, "楼上走廊": {"name": "楼上走廊", "back": "前门入口", "left": "艾米丽的房间", "right": "楼上卫生间", "forward": "走廊尽头", "text": "楼上只有一条长长的走廊。左边是一扇画着小女孩涂鸦的门,右边是一扇开着的卫生间门。走廊深处还有几扇门。"}, "艾米丽的房间": {"name": "艾米丽的房间", "right": "楼上走廊", "item": "艾米丽的日记", "text": "走进女孩的房间,墙上贴着拼成'艾米丽'的字母。房间很小,摆满了玩具、画和蜡笔。床很朴素,紫色床罩,一本书的角从毯子下面露出来。"}, "楼上卫生间": {"name": "楼上卫生间", "left": "楼上走廊", "text": "卫生间大得惊人。你被镜子上锈褐色的血迹吓到了。你壮着胆子拉开浴帘,照片里的母亲尸体躺在里面,头上有个大洞。气味难闻,尸体已经腐烂,在这里很久了。你不想待在这个房间里。"}, "走廊尽头": {"name": "走廊尽头", "back": "楼上走廊", "left": "诡异夫妇的房间", "forward": "阁楼", "text": "走到走廊尽头,你看到通往阁楼的梯子是放下的。左边是另一扇门。"}, "诡异夫妇的房间": {"name": "诡异夫妇的房间", "right": "走廊尽头", "item": "研究日志", "text": "这个房间显然是艾米丽父母的。布置简朴,床整理得很好,右边有个大书桌。桌上放着一本打开的日志。"}, "阁楼": {"name": "阁楼", "back": "走廊尽头", "forward": "诡异房间", "item": "末世报纸", "text": "爬上阁楼梯子,你忍不住感到恶心。眼前的景象显然是那个戴眼镜男人(艾米丽的父亲)的工作区,像停尸间一样摆满了盖着布的桌子。角落有个化学实验台,房间尽头有一扇加固过的门。你路过实验台时看到几张散落的纸。"}, "诡异房间": {"name": "诡异房间", "text": "你心里害怕,但好奇心占了上风。里面只有一张小医疗床,显然是艾米丽被父亲强迫待在这里做实验的地方。地上有一具残缺的尸体——艾米丽的父亲。你差点没注意到艾米丽朝你扑过来。"} } # 初始化游戏核心资源 directions = ['forward', 'back', 'right', 'left'] items_dict = inventory() rooms = house() player_inventory = [] main_menu() current_room_name = "前院" while True: # 获取当前房间的完整信息 current_room = rooms[current_room_name] # 触发结局逻辑 if current_room_name == "诡异房间": if len(player_inventory) == 7: print("幸运的是,你找到了房子里所有诡异的物品,了解了艾米丽作为零号病人的历史,还找到了一把大砍刀。你用它自卫,挥砍艾米丽,趁机逃出房间,头也不回地跑了。") print("好结局") else: print("不幸的是,你没收集全所有物品,没有办法抵御扑过来的艾米丽。她把你拖进房间深处。") print("坏结局") # 结局后退出游戏循环 break # 打印当前房间描述 print("\n" + current_room["text"]) # 处理房间物品拾取逻辑 if "item" in current_room: item_name = current_room["item"] # 检查物品是否已被拾取 if item_name not in player_inventory: choice = input(f"\n你发现了{item_name},是否拾取?(yes/no) ").lower() if choice == 'yes': player_inventory.append(item_name) print(f"你拾取了{item_name}:{items_dict[item_name]['description']}") print(f"当前背包:{player_inventory}") elif choice == 'no': print("你没有拾取这个物品。") else: print("无效输入,跳过物品拾取。") # 处理玩家指令 command = input("\n你要做什么? ").lower() if command in directions: if command in current_room: # 更新当前房间名称 current_room_name = current_room[command] else: print("你不能往那个方向走。") elif command == 'quit': print("感谢游玩!") break else: print("无效指令,请重新输入。")
关键修改说明
- 修复缩进问题:将所有游戏逻辑移入
while True循环内部,确保每次循环都能执行完整的游戏流程。 - 调整变量作用域:让
house()和inventory()函数返回对应字典,外部可正常调用;初始化player_inventory列表存储玩家物品。 - 修正房间访问逻辑:通过
rooms[current_room_name]获取房间详细信息,正确读取描述文本。 - 完善物品拾取功能:新增物品状态检查、玩家选择处理、背包更新逻辑。
- 修正输入指令:移除主菜单方向提示中的多余逗号,确保输入匹配。
- 添加循环退出机制:结局触发后用
break退出循环,避免重复打印结局。 - 中文本地化:将所有游戏文本翻译成中文,提升体验。
内容的提问来源于stack exchange,提问作者caseynicole
相关产品推荐
相关产品推荐

