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

Python 3文本冒险游戏:拾取物品后无法删除房间物品求助

Python 3文本冒险游戏物品删除逻辑修复

问题描述

我是编程新手,用Python 3开发文本冒险游戏时遇到问题:执行del rooms[currm]['Item']后,房间内的物品并未真正被移除——首次拾取物品(比如Armor)能正常加入背包,但重复拾取时仍显示“获取成功”,而非预期的“这里没有这个物品”提示。调整过这条语句的缩进,问题依旧。

完整代码

# 物品与方向初始化
item = None
direction = 'direction'


def instructions():
    # 打印主菜单和命令说明
    print('\n' + ('\t' * 18) + f'''Evil Sorceress Text Adventure Game\n
                  收集全部6件物品即可获胜,否则会被邪恶女巫Daeris击败。
                  移动命令:'Go {direction}'(North, South, East, West)
                  拾取物品:Get {'Item'}\n\n''')


def prologue():  # 故事背景
    print('\t\t邪恶女巫Thalya为她的主人占领了邻国城堡:')
    print('\n' + ('\t' * 10) + '\033[1m' + '终极邪恶。' + '\033[0m\n')
    print('''\t\t现在轮到你击败她,为正义夺回城堡!你将从门房进入。
        你必须从警卫室获取护甲(Armor)用于近战防御。
        从附魔室获取护身符(Amulet)用于魔法防御。
        从图书馆获取法术书(Spellbook)破解她的魔法护盾。
        从庭院获取火把(Torch)照亮房间。
        从军械库获取剑(Sword)击败她。
        最后从大厅获取火鸡腿(Turkey Leg)——空腹对抗邪恶可不是好主意!'''
          '\n')


# 房间、物品与方向配置
rooms = {'Throne Room': {'South': 'Great Hall', 'Boss': 'Daeris'},
         'Great Hall': {'North': 'Throne Room', 'West': 'Library', 'South': 'Courtyard', 'East': 'Armory',
                        'Item': 'Turkey Leg'},
         'Library': {'East': 'Great Hall', 'Item': 'Spellbook'},
         'Courtyard': {'North': 'Great Hall', 'South': 'Gatehouse', 'East': 'Enchanting Room', 'Item': 'Torch'},
         'Armory': {'West': 'Great Hall', 'South': 'Enchanting Room', 'Item': 'Sword'},
         'Enchanting Room': {'North': 'Armory', 'West': 'Courtyard', 'Item': 'Amulet'},
         'Gatehouse': {'North': 'Courtyard', 'East': 'Guard House', },
         'Guard House': {'West': 'Gatehouse', 'Item': 'Armor'},
         }

inv = []  # 背包变量
vowels = ['a', 'e', 'i', 'o', 'u']  # 元音列表
currm = 'Gatehouse'  # 起始房间为门房
pin = ''  # 上一次操作的提示信息

# 打印背景故事与操作说明
prologue()
input('\n 按任意键继续\n\n')
instructions()

# 游戏循环
while True:
    print(f'\n当前位置: {currm}\n背包 : {inv}\n{"~" * 27}')
    print(pin)

    # 物品拾取提示
    if 'Item' in rooms[currm].keys():
        nitem = rooms[currm]['Item']
        if nitem not in inv:
            if nitem[0].lower() not in vowels:
                print(f"这里有一个{nitem}。要拾取它吗?\n")
            else:
                print(f"这里有一件{nitem}。要拾取它吗?\n")

    if 'Boss' in rooms[currm].keys():  # 游戏结束条件
        if len(inv) == 6:
            print('''恭喜!
            你到达了王座室并击败了邪恶女巫Daeris。
            成功为正义夺回了城堡!''')
            break
        else:
            print('Daeris击败了你,终极邪恶获得了胜利!')
            break

    # 获取玩家输入的动作
    uin = input('请输入你的动作:\n')

    # 拆分输入为单词
    move = uin.split(' ')

    # 第一个单词是动作
    action = move[0].title()

    # 第二个及以后的单词是目标物品或方向
    if len(move) > 1:
        item = move[1:]
        direction = move[1].title()
        item = ' '.join(item).title()

    # 移动逻辑
    if action == 'Go':
        try:
            currm = rooms[currm][direction]
            pin = f'你向{direction}方向前进\n'
        except:
            pin = '无效的方向!\n'

    # 拾取物品逻辑(修复后)
    elif action == 'Get':
        try:
            # 先判断房间是否存在该物品
            if 'Item' in rooms[currm] and item == rooms[currm]['Item']:
                if item not in inv:
                    inv.append(item)
                    if item == 'Turkey Leg':
                        pin = f'{item}已获取!嗷呜嗷呜。\n'
                    else:
                        pin = f'{item}已获取!\n'
                    # 拾取成功后立即删除房间内的物品
                    del rooms[currm]['Item']
                else:
                    # 物品已在背包,提示无法重复拾取
                    pin = '这里没有这个物品\n'
            else:
                pin = '这里没有这个物品\n'
        except:
            pin = f'那个{item}在别的地方\n'

当前错误效果

Enter your move:
get armor

Current Position: Guard House
Inventory : ['Armor']
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Armor obtained!

期望效果

Enter your move:
get armor

这里没有这个物品

问题分析与修复点

  • 删除语句位置错误:原代码中del rooms[currm]['Item']放在“物品已在背包”的分支里,即使删除物品也没有对应提示逻辑,且下次拾取会触发KeyError进入异常块,显示错误提示。修复后改为拾取成功后立即删除房间物品,确保房间内不再存在该物品。
  • 条件判断漏洞:原代码未先判断房间是否存在Item键,导致物品删除后再次拾取抛出异常。修复时先检查'Item' in rooms[currm],再判断物品是否匹配。
  • 火鸡腿判断错误:原代码if item == ['Turkey Leg']是字符串与列表比较,永远为False,改为if item == 'Turkey Leg'即可触发特殊提示。

修复后验证

首次拾取Armor后,房间的Item键被删除,再次输入get armor时,会直接触发“这里没有这个物品”的提示,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:29:55