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

