You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何启动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("无效指令,请重新输入。")

关键修改说明

  1. 修复缩进问题:将所有游戏逻辑移入while True循环内部,确保每次循环都能执行完整的游戏流程。
  2. 调整变量作用域:让house()和inventory()函数返回对应字典,外部可正常调用;初始化player_inventory列表存储玩家物品。
  3. 修正房间访问逻辑:通过rooms[current_room_name]获取房间详细信息,正确读取描述文本。
  4. 完善物品拾取功能:新增物品状态检查、玩家选择处理、背包更新逻辑。
  5. 修正输入指令:移除主菜单方向提示中的多余逗号,确保输入匹配。
  6. 添加循环退出机制:结局触发后用break退出循环,避免重复打印结局。
  7. 中文本地化:将所有游戏文本翻译成中文,提升体验。

内容的提问来源于stack exchange,提问作者caseynicole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:14:59