Python文本游戏出现TypeError: unhashable type: 'list'错误求助
解决文本类游戏中的TypeError: unhashable type: 'list'错误
我正在为课程开发一款文本类游戏,已经完成大部分代码,但测试时出现TypeError: unhashable type: 'list'错误。我检查了相关变量但仍无法解决,请求帮助。
游戏代码
def show_instructions(): # 定义游戏说明,方便后续调用 print('x' * 75) print('逃离魔法监狱!') print('从监狱的不同房间收集六件护身符。') print('务必避开典狱长!') print('如果所在房间有物品,请输入:"Get [物品名称]"') print('移动到其他房间请输入:"Go [方向]"') print('x' * 75) # 打印75个x分隔行,让界面更清晰 def player_status(inventory, current_room, rooms): # 定义玩家状态函数,方便后续调用 print('x' * 75) print('你当前在', current_room) print('当前背包:', inventory) if 'item' in rooms[current_room]: print('地上有一个', rooms[current_room]['item']) print('x' * 75) def game(): inventory = [] # 玩家初始背包为空 rooms = { '牢房': {'南': '浴室'}, '浴室': {'北': '牢房', '东': '食堂', 'item': '剃刀护身符'}, '食堂': {'西': '浴室', '北': '厨房', '东': '小卖部', '南': '院子', 'item': '勺子护身符'}, '院子': {'北': '食堂', 'item': '断线钳护身符'}, '厨房': {'南': '食堂', 'item': '长柄勺护身符'}, '小卖部': {'西': '食堂', '北': '典狱长办公室', '东': '图书馆', 'item': '代币护身符'}, '典狱长办公室': {'南': '小卖部', 'item': '典狱长'}, '图书馆': {'西': '小卖部', 'item': '日期戳护身符'} } # 定义房间结构、可移动方向及房间内物品 current_room = ['牢房'] # 设置玩家初始房间 show_instructions() while True: player_status(inventory, current_room, rooms) command = input('你想做什么?\n') if len(inventory) == 6: print('你收集到了所有必需的护身符!') print('获得所有护身符后,你现在可以穿墙了!') print('你用新能力逃出了监狱。') print('x' * 75) print('游戏结束,你赢了!') print('x' * 75) elif command.split()[0].capitalize() == 'GO': command = command.split()[1].capitalize() if command in rooms[current_room]: current_room = rooms[current_room][command] if current_room == '典狱长办公室': print('你进入了典狱长办公室!\n典狱长用魔法束缚了你。\n典狱长把你锁回了牢房。') print('x' * 75) print('游戏结束\n感谢游玩。') print('x' * 75) break else: print('那边没有门。') elif command.split()[0].capitalize() == 'GET': command = command.split()[1].capitalize() if command in rooms[current_room]['item']: inventory.append(command) del rooms[current_room]['item'] else: print('输入无效,请检查拼写。') else: print('输入无效,请检查拼写。') game()
报错信息
Traceback (most recent call last): File "C:\Users\tyler\PycharmProjects\VariousSchool\TextBasedGame.py", line 84, in <module> game() File "C:\Users\tyler\PycharmProjects\VariousSchool\TextBasedGame.py", line 50, in game player_status(inventory, current_room, rooms) File "C:\Users\tyler\PycharmProjects\VariousSchool\TextBasedGame.py", line 22, in player_status if 'item' in rooms[current_room]: ~~~~~^^^^^^^^^^^^^^ TypeError: unhashable type: 'list'
问题原因及修复方案
- 问题根源:你把
current_room定义成了列表['牢房'],而字典rooms的键是字符串类型。列表是不可哈希的对象,不能作为字典的键来访问rooms[current_room],这直接触发了报错。 - 修复步骤:
- 将
current_room = ['牢房']改为current_room = '牢房',把列表类型改成字符串类型。 - 所有后续使用
current_room访问rooms字典的地方都会自动正常工作,因为现在current_room是合法的字符串键。
- 将
修复后的完整代码
def show_instructions(): # 定义游戏说明,方便后续调用 print('x' * 75) print('逃离魔法监狱!') print('从监狱的不同房间收集六件护身符。') print('务必避开典狱长!') print('如果所在房间有物品,请输入:"Get [物品名称]"') print('移动到其他房间请输入:"Go [方向]"') print('x' * 75) # 打印75个x分隔行,让界面更清晰 def player_status(inventory, current_room, rooms): # 定义玩家状态函数,方便后续调用 print('x' * 75) print('你当前在', current_room) print('当前背包:', inventory) if 'item' in rooms[current_room]: print('地上有一个', rooms[current_room]['item']) print('x' * 75) def game(): inventory = [] # 玩家初始背包为空 rooms = { '牢房': {'南': '浴室'}, '浴室': {'北': '牢房', '东': '食堂', 'item': '剃刀护身符'}, '食堂': {'西': '浴室', '北': '厨房', '东': '小卖部', '南': '院子', 'item': '勺子护身符'}, '院子': {'北': '食堂', 'item': '断线钳护身符'}, '厨房': {'南': '食堂', 'item': '长柄勺护身符'}, '小卖部': {'西': '食堂', '北': '典狱长办公室', '东': '图书馆', 'item': '代币护身符'}, '典狱长办公室': {'南': '小卖部', 'item': '典狱长'}, '图书馆': {'西': '小卖部', 'item': '日期戳护身符'} } # 定义房间结构、可移动方向及房间内物品 current_room = '牢房' # 修复:将列表改为字符串 # 设置玩家初始房间 show_instructions() while True: player_status(inventory, current_room, rooms) command = input('你想做什么?\n') if len(inventory) == 6: print('你收集到了所有必需的护身符!') print('获得所有护身符后,你现在可以穿墙了!') print('你用新能力逃出了监狱。') print('x' * 75) print('游戏结束,你赢了!') print('x' * 75) break # 修复:添加break退出循环,避免继续执行后续逻辑 elif command.split()[0].capitalize() == 'GO': # 处理空输入情况,避免索引越界错误 if len(command.split()) < 2: print('请输入完整指令,例如:Go South') continue direction = command.split()[1].capitalize() if direction in rooms[current_room]: current_room = rooms[current_room][direction] if current_room == '典狱长办公室': print('你进入了典狱长办公室!\n典狱长用魔法束缚了你。\n典狱长把你锁回了牢房。') print('x' * 75) print('游戏结束\n感谢游玩。') print('x' * 75) break else: print('那边没有门。') elif command.split()[0].capitalize() == 'GET': # 处理空输入情况,避免索引越界错误 if len(command.split()) < 2: print('请输入完整指令,例如:Get Razor Talisman') continue item = command.split()[1].capitalize() # 优化:先检查房间是否有物品,再匹配物品名称 if 'item' in rooms[current_room] and item in rooms[current_room]['item']: inventory.append(item) del rooms[current_room]['item'] print(f'你获得了{item}!') else: print('这个房间里没有这个物品,请检查拼写。') else: print('输入无效,请检查指令格式,例如:Go South 或 Get Razor Talisman') game()
内容的提问来源于stack exchange,提问作者Praetor
相关产品推荐
相关产品推荐

