构建一个 python 基于文本的游戏:我正在尝试访问字典中的特定值

building a python text-based game: im trying to access a specific value inside of a dictionary

大家好,我正在为 class 构建一个基于文本的游戏,我在房间之间移动并尝试收集所有物品而不进入恶棍的房间,在这种情况下是 Record Executive,并且我只是在直接访问该项目时遇到问题,以便我可以将其添加到我的库存列表中..

这是我的字典:

rooms = {
    'Lobby':{'East': 'Bar'},
    'Roof':{'South': 'Bar', 'East': 'Stage', 'Item': 'Steel guitar'},
    'Bar':{'West': 'Lobby', 'North': 'Roof', 'East': 'Bathroom', 'South': 'Basement', 'Item': 'Keyboard'},
    'Basement':{'North': 'Bar', 'East': 'Studio', 'Item': 'Drums'},
    'Stage':{'West': 'Roof', 'Item': 'Microphone'},
    'Soundcheck':{'South': 'Bathroom', 'Item': 'Bass Guitar'},
    'Bathroom':{'North': 'Soundcheck', 'West': 'Bar', 'Item': 'Electric Guitar'},
    'Studio': {'West': 'Basement', 'Item': 'Record Executive'}
}

这是我的移动代码:

while gameOver != True:
    playerStats(currentRoom, inventory, rooms)
    # currentRoom
    playerMove = input('Enter your move:\n')

    try:
        currentRoom = rooms[currentRoom][playerMove]
    except Exception:
        print('Invalid move')
        continue

我从大堂向东移动,我现在的房间变成了酒吧,但我不知道如何去里面的 'Item' 属性 所以我可以添加 'Keyboard' 到我的库存清单...任何帮助将不胜感激!谢谢

索引你想要的字典

currentRoom['Item']

您将在 移动之后将其添加到列表中,因此在最后(在“try”、“except”部分之后)您将添加:

    inventory.append(currentRoom['Item'])

通过将其放在移动代码之后,您可以从新房间而不是现有房间中取出物品。

有些房间可能没有物品,那么您可以这样做:

    try:
        inventory.append(currentRoom['Item'])
    except KeyError:
        pass

这可以防止您在没有物品的情况下进入房间时出现错误。

另外,您可能希望在拿走物品时将其从房间中取出。这样你就可以了。

    try:
        inventory.append(currentRoom['Item'])
        del currentRoom['Item']
    except KeyError:
        pass

del 从字典中删除键


顺便说一句,在你的移动代码中,你也应该改变

    except Exception:

    except KeyError:

因此,如果出现不同的异常(例如,您按 ctrl-C),则它不会捕获它。

就像这个命令

currentRoom = rooms[currentRoom][playerMove]

您可以尝试将房间中的物品附加到变量(库存)中,最好是一个列表(或者一个满足您要求的集合)

inventory = []

for i in rooms:
    for j in i:
        if j == 'Item':
            inventory.append(rooms[i][j])

现在应该是这样的:

inventory = []
gameOver = False

rooms = {
    'Lobby':{'East': 'Bar'},
    'Roof':{'South': 'Bar', 'East': 'Stage', 'Item': 'Steel guitar'},
    'Bar':{'West': 'Lobby', 'North': 'Roof', 'East': 'Bathroom', 'South': 'Basement', 'Item': 'Keyboard'},
    'Basement':{'North': 'Bar', 'East': 'Studio', 'Item': 'Drums'},
    'Stage':{'West': 'Roof', 'Item': 'Microphone'},
    'Soundcheck':{'South': 'Bathroom', 'Item': 'Bass Guitar'},
    'Bathroom':{'North': 'Soundcheck', 'West': 'Bar', 'Item': 'Electric Guitar'},
    'Studio': {'West': 'Basement', 'Item': 'Record Executive'}
}


while not gameOver:
    playerStats(currentRoom, inventory, rooms)
    # currentRoom
    playerMove = input('\n Enter your move: ')

    if playerMove == 'pick' or playerMove == 'acquire' or playerMove == 'get':
        # add to inventory if exists
        for i in rooms:
            for j in i:
                if j == 'Item':
                    inventory.append(rooms[i][j])
                else:
                    print('nothing to pick')
    else:
        try:
            currentRoom = rooms[currentRoom][playerMove]
        except Exception:
            print('Invalid move')
            continue

编辑:

另外,您现在应该从房间中删除该物品,因为它现在已被获取--

(@Addlestrop 在他们的回答中也指出)

        for i in rooms:
            for j in i:
                if j == 'Item':
                    inventory.append(rooms[i][j])
                    del rooms[i][j]
                    # copy item to inventory and delete from the room
                else:
                    print('nothing to pick')