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
相关产品推荐
相关产品推荐

