Skip to content
Advertisement

Room Exploration; Issues with collecting items from a dictionary

I’m creating a room exploration game with Python but am having issues with item collection and the win condition being met (collecting all items to ‘win’ and losing if not all items are collected). Room movement, help and quitting function but I’m confused where to begin with items. I created an elif for ‘get’ to collect items but it didn’t work. If I could get help with getting items from my dictionary would help a lot. Thank you.

rooms = {'Start room': {'name': 'Start room', 'west': 'West room', 'east': 'East room', 'north': 'Hallway',
                        'text': 'You are in the Start room.'},
         'Hallway': {'name': 'Hallway', 'north': 'Hallway2', 'item': 'chips',
                     'text': 'You are in the Hallway.'},
         'Hallway2': {'name': 'Hallway2', 'north': 'Hallway3', 'item': 'soda',
                      'text': 'You are in the Hallway2.'},
         'Hallway3': {'name': 'Hallway3', 'north': 'Final room', 'item': 'stick',
                      'text': 'You are in the Hallway #3.'},
         'Side room': {'name': 'Side room', 'east': 'Hallway3', 'item': 'cookie bug',
                       'text': 'You are in the Side room.'},
         'Final room': {'name': 'Final room', 'south': 'Hallway3',
                        'text': 'You are in the Final room.'},  # boss room
         'West room': {'name': 'West room', 'east': 'Start room', 'item': 'crown',
                       'text': 'You are in the West room.'},
         'East room': {'name': 'East room', 'west': 'Start room', 'item': 'cape',
                       'text': 'You are in East room.'}}


def get_item(item_wants, current_room, inventory):
    if 'item' in rooms[current_room]:
        item_can_get = rooms[current_room]['item']
        if item_wants != item_can_get.lower():
            print(f'There is no {item_can_get} in this room')
        else:
            print(f'You just picked up {item_wants}')
            inventory.append(item_wants)
            return item_wants


def help_file(DIRECTIONS):
    print(f"Use {DIRECTIONS} to move! If you would like to quit, type 'quit'.")


def get_input():
    arg = ''  # default if no arg
    input_list = input('Enter move, get or exit:').split()
    command = input_list[0]
    if len(input_list) > 1:
        arg = input_list[1]
    return command, arg


def main():
    inventory = []
    DIRECTIONS = ['north', 'south', 'east', 'west']
    current_room = 'Start room'
    while True:
        # location
        print('You are in {}.'.format(current_room))
        print("Inventory:", inventory)

        # get user input
        c, direction = get_input()
        # moving
        if c == 'move' and direction in DIRECTIONS:
            if direction in rooms[current_room]:
                current_room = rooms[current_room][direction]
            else:
                print(f'You cannot go {direction} from this room')

        elif c == 'get':
            pass

        elif c == 'help':
            help_file(DIRECTIONS)

        elif c == 'quit':
            print('Game quitting...')
            break
        else:
            print('Invalid statement')

        if current_room == 'Final room' and len(inventory) < 6:
            print('You lost ! You forgot to collect all the items! GAME OVER...')
            break
        if current_room == 'Final room' and len(inventory) >= 6:
            print('You did it! You collected all the items and are with your cool new friend! The end!')
            break

        print()


main()

Advertisement

Answer

In testing out your code it appeared where you were getting stuck was with the “getting” of items within a room. With that, I focused on tweaking the “get_item” function. Following is a copy of your code with some tweaks to the dictionary so that one could move about rooms a little easier and a refined “get_item” function.

rooms = {'Start room': {'name': 'Start room', 'west': 'West room', 'east': 'East room', 'north': 'Hallway',
                        'text': 'You are in the Start room.'},
         'Hallway': {'name': 'Hallway', 'north': 'Hallway2', 'south': 'Start room', 'item': 'chips',
                     'text': 'You are in the Hallway.'},
         'Hallway2': {'name': 'Hallway2', 'north': 'Hallway3', 'south': 'Hallway', 'item': 'soda',
                      'text': 'You are in the Hallway2.'},
         'Hallway3': {'name': 'Hallway3', 'north': 'Final room', 'south': 'Hallway2', 'west': 'Side room', 'item': 'stick',
                      'text': 'You are in the Hallway #3.'},
         'Side room': {'name': 'Side room', 'east': 'Hallway3', 'item': 'cookie',
                       'text': 'You are in the Side room.'},
         'Final room': {'name': 'Final room', 'south': 'Hallway3',
                        'text': 'You are in the Final room.'},  # boss room
         'West room': {'name': 'West room', 'east': 'Start room', 'item': 'crown',
                       'text': 'You are in the West room.'},
         'East room': {'name': 'East room', 'west': 'Start room', 'item': 'cape',
                       'text': 'You are in East room.'}}

item_list = ['chips', 'soda', 'stick', 'cookie', 'crown', 'cape']  # Added this for a simplified check of what items have been acquired

def get_item(item_wants, current_room, inventory):  # Enhanced this function.
    if 'item' in rooms[current_room]:
        item_can_get = rooms[current_room]['item']
        if item_wants != item_can_get.lower():
            print(f'There is no {item_wants} in this room')
        else:
            got_item = False
            for i in range(len(inventory)):
                if (inventory[i] == item_wants):
                    print("you already have this item")
                    got_item = True
            if (got_item == False):
                print(f'You just picked up {item_wants}')
                inventory.append(item_wants)
            got_all = True
            for i in range(len(item_list)):
                if (item_list[i] not in inventory):
                    got_all = False
                    print("You need to find", item_list[i])
            return item_wants

def help_file(DIRECTIONS):
    print(f"Use {DIRECTIONS} to move! If you would like to quit, type 'quit'.")


def get_input():
    arg = ''  # default if no arg
    input_list = input('Enter move, get or quit:').split()
    command = input_list[0]
    if len(input_list) > 1:
        arg = input_list[1]
    return command, arg

def main():
    inventory = []
    DIRECTIONS = ['north', 'south', 'east', 'west']
    current_room = 'Start room'
    while True:
        # location
        print('You are in {}.'.format(current_room))
        print("Inventory:", inventory)

        # get user input
        c, direction = get_input()
        # moving
        if c == 'move' and direction in DIRECTIONS:
            if direction in rooms[current_room]:
                current_room = rooms[current_room][direction]
            else:
                print(f'You cannot go {direction} from this room')

        elif c == 'get':
            get_item(direction, current_room, inventory)

        elif c == 'help':
            help_file(DIRECTIONS)

        elif c == 'quit':
            print('Game quitting...')
            break
        else:
            print('Invalid statement')

        if current_room == 'Final room' and len(inventory) < 6:
            print('You lost ! You forgot to collect all the items! GAME OVER...')
            break
        if current_room == 'Final room' and len(inventory) >= 6:
            print('You did it! You collected all the items and are with your cool new friend! The end!')
            break

        print()

main()

Give that a try.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement