Python文本游戏问题:条件语句无法返回上下文相关信息
问题核心分析
- KeyError触发原因:拾取物品后直接从房间字典中删除了
item键,后续进入房间访问该键时因键不存在报错 - 首次进入显示无物品原因:判断逻辑错误,比如误将"玩家是否持有物品"作为房间描述的判断依据,或是初始化时错误设置了房间物品状态
修正方案
1. 调整房间数据结构
给每个房间明确区分带物品/无物品的描述,保留item字段标记物品状态(存在/已被拾取),避免删除键引发KeyError:
# 房间定义:包含两种描述+物品状态 rooms = { 'hall': { 'desc_with_item': '你站在大厅里,墙角靠着一把*生锈的铜钥匙*,表面落着薄灰。', 'desc_no_item': '你回到大厅,墙角空空的,之前的钥匙已经不见了。', 'item': {'name': '铜钥匙', 'desc': '能打开书房门的旧钥匙'} }, 'study': { 'desc_with_item': '书房里书架林立,桌上摆着一本*泛黄的魔法笔记*。', 'desc_no_item': '书房里书架林立,桌上什么都没有。', 'item': None # 初始无物品的房间 } } # 玩家状态 player = { 'current_room': 'hall', 'inventory': [] }
2. 编写房间描述获取函数
根据房间item字段的状态返回对应描述:
def get_room_desc(room_data): # 物品存在则返回带物品的描述,否则返回无物品版本 return room_data['desc_with_item'] if room_data['item'] is not None else room_data['desc_no_item']
3. 修复拾取物品逻辑
拾取后将房间item设为None而非删除键,同时添加存在性判断:
def pick_up(): current_room = rooms[player['current_room']] if current_room['item'] is not None: player['inventory'].append(current_room['item']) # 标记物品已被拾取,而非删除键 current_room['item'] = None print(f"你捡起了{player['inventory'][-1]['name']}!") else: print("这里没有能捡的东西。")
测试验证
# 首次进入大厅 print(get_room_desc(rooms[player['current_room']])) # 输出:你站在大厅里,墙角靠着一把*生锈的铜钥匙*,表面落着薄灰。 # 执行拾取 pick_up() # 输出:你捡起了铜钥匙! # 再次查看大厅描述 print(get_room_desc(rooms[player['current_room']])) # 输出:你回到大厅,墙角空空的,之前的钥匙已经不见了。
关键修复点
- 保留房间
item字段,拾取后设为None,彻底避免KeyError - 拆分两种房间描述,通过
item状态精准匹配展示内容 - 拾取逻辑先判断物品存在性,再执行操作,避免无效触发错误
内容的提问来源于stack exchange,提问作者Skiing Downhill
相关产品推荐
相关产品推荐

