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

Python文本冒险游戏问题:无法触发Villain逻辑及物品重复拾取

文本冒险游戏问题修复指南

问题说明

作为Python新手,我开发的文本冒险游戏已实现移动和物品拾取基础功能,但存在两个问题:

  • 物品拾取逻辑异常:已拥有的物品仍会被重复添加到库存
  • 进入包含Villain的房间时,对应的触发逻辑从未执行,仅像普通房间一样显示库存并要求下一步操作

原物品拾取代码

if 'item' in inventory:
    print('You already have the ', rooms[current_room]['item'])
    player_move = input('Enter your move: ')
    action = player_move.title().split()
    print('-------------------')
elif action[1] == rooms[current_room]['item'] and 'item' not in inventory:
    inventory.append(action[1])
    print(rooms[current_room]['item'], 'retrieved')
    player_move = input('Enter your move: ')
    action = player_move.title().split()
    print('-------------------')

原Villain触发代码

if 'Villain' in rooms[current_room].keys():
    if len(inventory) < 6:
         print("You got caught before you could complete your mission! :(")
         break

    else:
         print("You successfully infiltrated the company!")
         break

问题1:物品重复拾取的修复

问题根源

原代码判断逻辑完全错误:'item' in inventory是检查字符串'item'是否在库存列表里,但库存存的是具体物品名称(比如'Key'),永远不会匹配,导致elif分支总会执行,重复添加物品。

修复后的代码

# 先获取当前房间的目标物品
target_item = rooms[current_room]['item']

# 检查是否已拥有该物品
if target_item in inventory:
    print(f'You already have the {target_item}')
elif action[1] == target_item:
    # 确认指令是拾取该物品,且未拥有时添加
    inventory.append(target_item)
    print(f'{target_item} retrieved')

# 统一处理输入(避免重复代码)
player_move = input('Enter your move: ')
action = player_move.title().split()
print('-------------------')

关键改进

  • 直接检查当前房间的物品名称是否在库存中,而非错误的字符串'item'
  • 移除冗余条件判断,简化逻辑
  • 将输入处理逻辑统一放在最后,避免重复代码

问题2:Villain触发逻辑不执行的修复

可能的问题根源

  1. 键名大小写不匹配:如果rooms字典中用的是小写'villain',而代码里判断的是大写'Villain',则永远触发不了
  2. 代码位置错误:这段逻辑没有放在进入房间后的优先执行位置,被其他逻辑(比如输入处理)覆盖,导致根本没机会运行

修复方案

步骤1:确认键名一致性

检查rooms字典定义,确保目标房间的键是'Villain'(或统一改成小写,同时修改判断条件),示例:

# 示例rooms字典,确保键名正确
rooms = {
    'Secret Lab': {
        'north': 'Exit',
        'Villain': True  # 键名必须和代码中的判断一致
    }
}

步骤2:调整代码位置并简化逻辑

将Villain检查逻辑放在进入房间后的第一位置(比如显示房间描述之后,物品拾取之前),同时简化判断代码:

# 进入房间后立即检查是否存在Villain
if 'Villain' in rooms[current_room]:
    if len(inventory) < 6:
        print("You got caught before you could complete your mission! :(")
        break
    else:
        print("You successfully infiltrated the company!")
        break

# 后续再处理物品拾取、输入等逻辑

关键改进

  • 移除冗余的.keys()调用,in操作符可直接检查字典的键
  • 确保逻辑在进入房间后优先执行,不会被其他流程跳过

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:41:12