Reputation: 7
Doing a project for a class where I have to make a text based game, and I am getting a KeyError upon running my code.
These are the 2 parts of my code where it says the error is stemming from
Line 26
def get_item(state):
return rooms[state]['Item']
Line 42
item = get_item(state)
Here is my full code, I have been looking and just can't seem to find the solution. If anyone can see what I am missing, I would really appreciate it.
rooms = {
'Outside': {'South': 'Main Hall'},
'Main Hall': {'North': 'Outside', 'East': 'Dining Room', 'West': 'Bedroom', 'South': 'Living Room'},
'Bedroom': {'West': 'Room with Villain', 'South': 'Bathroom', 'Item': 'Hat'},
'Dining Room': {'South': 'Kitchen', 'West': 'Main Hall', 'Item': 'Chair leg'},
'Kitchen': {'West': 'Living Room', 'North': 'Dining Room', 'East': 'Garage', 'Item': 'Snack'},
'Living Room': {'North': 'Main Hall', 'East': 'Kitchen', 'Item': 'TV Remote'},
'Garage': {'West': 'Kitchen', 'Item': 'Bike'},
'Bathroom': {'North': 'Bedroom', 'South': 'Room with Villain', 'Item': 'Toilet paper'},
'Room with Villain': {'East': 'Bedroom', 'North': 'Room with Villain', 'Item': 'Witch'}
}
state = 'Outside'
def get_new_state(state, direction):
new_state = state
for i in rooms:
if i == state:
if direction in rooms[i]:
new_state = rooms[i][direction]
return new_state
def get_item(state):
return rooms[state]['Item']
def show_instructions():
print('Witch Hunt Adventure Game')
print('Collect the 6 items to win the game, or the Witch will attack you.')
print('Movement commands: go South, go North, go East, or go West')
print("To add an item to your inventory: get 'item_name'")
show_instructions()
Inventory = []
items = ['Hat', 'Chair leg', 'Snack', 'Bike', 'Toilet paper', 'TV Remote']
while (1):
print('You are in ', state)
print('Inventory:', Inventory)
item = get_item(state)
print('You see a ', item)
print('--------------------')
if item == 'Witch':
print('YOU HAVE BEEN CAUGHT! GAME OVER')
exit(0)
direction = input('Enter your move: ')
if direction == 'go East' or direction == 'go West' or direction == 'go North' or direction == 'go South':
direction = direction[3:]
new_state = get_new_state(state, direction)
if new_state == state:
print('There is a wall there')
else:
state = new_state
elif direction == str('get ' + item):
if item in Inventory:
print('Item already taken, go to another room!')
else:
Inventory.append(item)
else:
print('Invalid input or move or item')
if len(Inventory) == 6:
print('Congratulations! After collecting all of those items, you have defeated the witch!')
exit(0)
Upvotes: 0
Views: 696
Reputation: 147266
Some of your rooms don't have items in them, for example
rooms['Outside'] = {'South': 'Main Hall'}
so attempting to access rooms['Outside']['Item']
will fail. You should perhaps use:
def get_item(state):
return rooms[state].get('Item', None)
This will return None
if there are no items in the room. In your main code you can then check for that:
item = get_item(state)
if item is not None:
print('You see a ', item)
Upvotes: 2