【问题标题】:I am making a text based adventure game, and the action commands are not working我正在制作基于文本的冒险游戏,但动作命令不起作用
【发布时间】:2021-10-26 03:00:20
【问题描述】:

强调的文字这是目前为止的代码:

# This displays the game's basic instructions.
def show_instructions():
    print("The Haunted Manor")
    print("Collect Pawpaw's Lucky Charms and Break the Ancient Curse")
    print("Avoid the cursed items haunting the Manor")
    print("Move Commands: 'go north', 'go south', 'go east', 'go west'")
    print("Get Items: get 'item name'")
    print("Type 'exit' if you'd like to quit\n")

# This defines the player's status, and displays it.
def player_status():
    print(current_room['text'])
    print()
    print("You are in: {}".format(current_room['name']))
    print("Items in your possession: {}".format(current_items))
    print("You see {}".format(current_room['item']))

# The following is a dictionary of rooms, their connections, items in them, and other information
rooms = {
    'Foyer': {
        'name': 'Foyer',
        'west': 'Dining Room',
        'south': 'Great Hall',
        'east': 'Billiards Room',
        'item': 'nothing',
        'text': 'Welcome to the Foyer'
    },
    # Start Room
    'Dining Room': {
        'name': 'Dining Room',
        'east': 'Foyer',
        'south': 'Kitchen',
        'item': 'Haunted Spork',
        'text': 'You have entered the Dining Room'
    },
    'Billiards Room': {
        'name': 'Billiards Room',
        'west': 'Foyer',
        'item': 'Lucky Rabbit Foot',
        'text': 'You are in the Billiards Room'
    },
    'Kitchen': {
        'name': 'Kitchen',
        'north': 'Dining Room',
        'east': 'Great Hall',
        'south': 'Laundry',
        'item': 'Silver Spoon',
        'text': 'Welcome to the Kitchen'
    },
    'Great Hall': {
        'name': 'Great Hall',
        'north': 'Foyer',
        'west': 'Kitchen',
        'south': 'Master Suite',
        'east': 'Observatory',
        'item': 'Monkey Paw',
        'text': 'The Great Hall welcomes you'
    },
    'Observatory': {
        'name': 'Observatory',
        'west': 'Great Hall',
        'south': 'Armory',
        'item': 'Ancient Curse',
        'text': 'You have entered the Observatory',
    },
    # Boss Room
    'Laundry': {
        'name': 'Laundry',
        'north': 'Kitchen',
        'east': 'Master Suite',
        'item': 'Lucky Hat',
        'text': 'You have entered the Laundry'
    },
    'Master Suite': {
        'name': 'Master Suite',
        'north': 'Great Hall',
        'west': 'Laundry',
        'south': 'Greenhouse',
        'east': 'Armory',
        'item': 'Horseshoe Belt Buckle',
        'text': 'This is the Master Suite'
    },
    'Armory': {
        'name': 'Armory',
        'west': 'Master Suite',
        'north': 'Observatory',
        'item': 'Shooting Star',
        'text': 'Welcome to the Armory'
    },
    'Greenhouse': {
        'name': 'Greenhouse',
        'north': 'Master Suite',
        'item': 'Four-Leaf Clover',
        'text': 'Welcome to the Greenhouse'
    },
}

# The following sets the player's initial location and items.
current_room = rooms['Foyer']
current_items = None

player_action = ''

show_instructions()

while True:
    player_status()
    player_action = input("What do you want to do?\n")
    player_action = player_action.split()

    if player_action[0] == 'exit':
        print("Come Back Soon")
        break

    elif len(player_action) != 2:
        print("That doesn't make any sense\n")

    elif player_action[0] == 'go':
        if player_action[1] in rooms[current_room]:
            current_room = rooms[current_room][player_action[1]]
        else:
            print("You cannot go that way")

    elif player_action[0] == 'get':
        if player_action[1] in rooms[current_room]:
            current_items += [player_action[1]]
            print("You got: ", player_action[1])
            del rooms[current_room]['item']
        else:
            print("What exactly were you looking for?")

我正在接受用户输入,将其分解为一个列表,使用第一项作为命令 player_action[0](第 124 和 130 行)并尝试使用第二项 player_action[1] 作为目标。

但是,当我尝试使用程序中的命令时,我收到以下错误:

Traceback(最近一次调用最后一次): 文件“C:\Users\josep\OneDrive\Desktop\IT 140\ADVENTURE GAME\main.py”,第 125 行,在 如果房间 [current_room] 中的 player_action[1]: TypeError: unhashable type: 'dict'

我该如何解决这个问题?

【问题讨论】:

    标签: python list dictionary typeerror


    【解决方案1】:

    试试

    if player_action[1] in rooms[current_room['name']]

    current_room 是一个字典...您不能将字典用作另一个字典的键(当您创建它时确实不是...)

    current_room 的键之一是 "name",这实际上是您房间字典的键

    也改变你的其他实例

    current_room = rooms[current_room][player_action[1]]

    new_room_name = current_room[player_action[1]]
    new_room = rooms[new_room_name]
    current_room = new_room
    

    【讨论】:

    • 这是该块的代码:elif player_action[0] == 'go': if player_action[1] in rooms[current_room['name']]: current_room = rooms[current_room] [player_action[1]] else: print("You cannot go that way") 不幸的是,我仍然遇到同样的错误。
    • 你还有rooms[current_room]而不是rooms[current_room["name"]]
    • 我错过了。 “go”功能现在可以工作了。我现在遇到了“get”命令的问题。
    • rooms[current_room] 是个问题...在任何地方您都需要获取 room_name 并以 rooms[room_name] 的身份访问它
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2013-07-08
    • 2016-01-08
    • 2018-07-28
    • 1970-01-01
    • 2015-09-10
    • 2016-01-23
    • 1970-01-01
    相关资源
    最近更新 更多