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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:33:24