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

Python文本游戏开发:拾取物品后移除房间物品防重复获取

文字游戏重复拾取物品漏洞修复

问题原因

你现在的代码出现重复拾取的核心原因是:玩家拾取物品后,仅修改了背包列表,没有同步修改房间配置字典里的物品数据,每次进入房间get_item()函数依然能读取到原本的物品配置,自然会出现重复拾取的问题。
另外你的代码还有一个隐藏逻辑bug:判断是否遇到Boss的条件写的是if 'item' == 'Dr. Finkelstein',这行判断永远不会成立——你是拿固定字符串'item'和Boss名做对比,不是拿当前房间的物品做对比,会导致玩家走到Boss房也触发不了结局。

修复方案

只需要做两处核心修改即可:

  • 玩家成功把物品加入背包后,直接删除当前房间字典里的item键,后续再进入该房间就会判定为无物品
  • 修正Boss判断的条件,改为判断当前房间获取到的物品是否为Boss

关键修改代码片段

拾取物品的分支修改后如下:

elif direction == str('get ' + item ).capitalize():
    if item == 'This room has no item!':
        print('这个房间没有可拾取的物品!')
    elif item in inventory:
        print('你已经拿过这个物品了,去其他房间看看吧!')
    else:
        inventory.append(item)
        # 核心修复:拾取后从房间配置里删掉该物品
        del rooms[current_room]['item']
        print(f'你已拾取{item},加入背包')

Boss判断的部分修改后如下:

print('-------------------------')
# 修正判断条件,用当前获取到的item和Boss名对比
if item == 'Dr. Finkelstein':
    if len(inventory) == 6:
        print('恭喜!你收集齐了所有道具,成功捕获了芬克尔斯坦博士的鬼魂,拯救了小镇!')
    else:
        print('你没有收集齐对抗鬼魂所需的全部道具,被芬克尔斯坦博士击败了。')
    break

修复后完整代码

import time
# 定义房间、移动方向、房间物品配置
rooms = {
        'Foyer': {'North' : 'Dining Hall', 'East' : 'Admin Office' },
        'Admin Office': {'West': 'Foyer', 'item': 'Key', },
        'Dining Hall': {'North' : 'Exam Room 1', 'South' : 'Foyer', 'East' : 'Bathroom', 'West' : 'Kitchen', 'item' : 'Flashlight', },
        'Bathroom': {'West': 'Dining Hall', 'item': 'Proton Pack' },
        'Kitchen': {'East': 'Dining Hall', 'item': 'Satchel' },
        'Exam Room 1': {'South' : 'Dining Hall', 'East' : 'Isolation Room', 'West': 'Patient Room 1', 'item' : 'Journal' },
        'Patient Room 1': {'East': 'Exam Room 1', 'item': 'Ghost Capsule' },
        'Isolation Room': {'West': 'Exam Room 1', 'item': 'Dr. Finkelstein' },
    }
# 游戏说明
def game_instructions():
   print('收集全部6件物品即可赢得游戏,否则会被芬克尔斯坦博士的鬼魂击败。')
   print('移动指令:North(北)、South(南)、East(东)、West(西)')
   print("拾取物品指令:get '物品名'")

print('你接到任务,前往学院山上的旧精神病院驱逐芬克尔斯坦博士的鬼魂。')
time.sleep(1)
print('这个鬼魂已经占据精神病院三个世纪,最近正打开通道召唤更多鬼魂涌入。')
time.sleep(1)
print('上次你仓皇逃离时弄丢了所有驱鬼道具,现在必须返回收集。')
time.sleep(1)
print('你需要集齐所有道具,捕获鬼魂关闭通道,整个小镇的命运都在你手上。')
time.sleep(1)
game_instructions()
time.sleep(1)

current_room = 'Foyer' # 玩家初始出生点在门厅
inventory = [] # 初始化空背包

def get_new_room(current_room, direction):
    new_room = current_room
    for i in rooms:
        if i == current_room:
            if direction in rooms[i]:
                new_room = rooms[i][direction]
    return new_room

def get_item(current_room):
    if 'item' in rooms[current_room]:
        return rooms[current_room]['item']
    else:
        return 'This room has no item!'

while current_room: # 游戏主循环
    print('\n-------------------------')
    print('当前位置:', current_room)
    print('背包物品:', inventory)
    item = get_item(current_room)
    print('房间内物品:', item)
    print('-------------------------')
    # 修正后的Boss判定逻辑
    if item == 'Dr. Finkelstein':
        if len(inventory) == 6:
            print('恭喜!你收集齐了所有必要道具,成功捕获芬克尔斯坦博士的鬼魂,拯救了小镇!')
        else:
            print('你没有集齐对抗鬼魂的全部道具,被芬克尔斯坦博士击败了。')
        break

    direction = input('请输入你要执行的操作 >>')
    direction = direction.capitalize() # 统一首字母大写匹配字典配置

    if direction in ['North', 'South', 'East', 'West']:
        new_room = get_new_room(current_room, direction)
        if new_room == current_room:
            print('前面是墙,走不通,再试试别的方向!')
        else:
            current_room = new_room
    elif direction == str('get ' + item ).capitalize():
        if item in inventory:
            print('你已经收集过这个物品了,去其他房间探索吧!')
        else:
            inventory.append(item)
            # 核心修复:拾取后从房间配置中删除该物品,避免重复拾取
            del rooms[current_room]['item']
            print(f'已拾取{item},放入背包')
    else:
        print('无效指令,请重新输入!')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:03:19