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

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],这直接触发了报错。
  • 修复步骤:
    1. 将current_room = ['牢房']改为current_room = '牢房',把列表类型改成字符串类型。
    2. 所有后续使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:45:26