I am new to this, but I am asking some input on this school project.
Any help will do.
I am creating move between the rooms and collecting items to kill an Alien.
I have tried to run the code but its giving me an error on the code and I was changing few things and still the same code.
here is the '''code''':
def input_instructions(item):
# Printing input instructions
print('Contain the Asset (Alien) Game')
print('Gather 7 items when landing at the objective')
print('Move to different locations on the map to gather the items: go
South, go East, go West, go North')
print("Add to Inventory: collect 'item'", item)
while True:
asked = input('Enter: GO <direction> or GET <item>: ').split()
if asked[0].upper() == "GO":
asked[1] = asked[1].capitalize()
if asked[1][0] == 'North' or asked[1][0] == 'South' or asked[1
[0]
== 'East' or asked[1][0] == 'West':
return asked[1]
else:
continue
elif asked[0].upper() == 'GET':
if asked[1].upper() == item.upper():
return item
else:
continue
# show the current status
def input_status(currentLocation, inventory, currentItem):
# print the players current location
print('Your current location is: ', currentLocation)
# print the players inventory options
print('Your inventory so far is: ', inventory)
# print an item if there is one
print('Your current item is: ', currentItem)
print()
# print out the locations
locations = {
'Transport Rover': {'North': 'Watch Tower', 'South': 'Landing Site1',
'East':
'Weapon Storage Facility', 'West': 'Launch Site'},
'Watch Tower': {'North': 'Transport Rover', 'East': 'Storage Room',
'item':
'Key Card'},
'Storage Room': {'West': 'Watch Tower', 'item': 'Flashlight'},
'Landing Site1': {'South': 'Transport Rover', 'East': 'Landing Site2',
'item':
'Transport Cage'},
'Landing Site2': {'East': 'Landing Site1', 'item': 'Energy Cells'},
'Testing Facility': {'West': 'Landing Site1', 'East': 'Testing Facility',
'item': 'Asset(Alien)'}, # Creature
'Weapon Storage Facility': {'East': 'Transport Rover', 'North': 'Medical
Wing', 'item': 'Laser Guns'},
'Medical Wing': {'South': 'Weapon Storage Facility', 'item': 'Medical
Supplies'},
'Launch Site': {'West': 'Transport Rover', 'item': 'Ammo'}
}
# print out the what each location has
storage = {
'Watch Tower': 'Key Card',
'Storage Room': 'Flashlight',
'Landing Site1': 'Transport Cage',
'Landing Site2': 'Energy Cells',
'Testing Facility': 'Asset(Alien)',
'Weapon Storage Facility': 'Laser Guns',
'Medical Wing': 'Medical Supplies',
'Launch Site': 'Ammo'
}
# input your current location
where = 'Transport Rover'
what = []
while True:
input_status(where, what, storage[where])
ans = input_instructions(storage[where])
if ans == storage[where]:
what.append(ans)
continue
else:
if ans in locations[where]:
where = locations[where][ans]
if where == 'Testing Facility':
print('You are now fighting the Alien...')
if len(what) > 3:
print('...')
print('Mission accomplish you and your team have capture
the Asset(Alien)!')
else:
print('...')
print('Mission Failed')
break
else:
print()`enter code here'
print('')
continue
Well, first of all, there is no Transport Rover in your storage but is in locations. So I guess you meant location[where] instead of storage[where]. There were also some indentation errors. I fixed a few ones, lemme know if it is what you want.
Here the code:
def input_instructions(item):
# Printing input instructions
print('Contain the Asset (Alien) Game')
print('Gather 7 items when landing at the objective')
print('Move to different locations on the map to gather the items: go South, go East, go West, go North')
print("Add to Inventory: collect 'item'", item)
while True:
asked = input('Enter: GO <direction> or GET <item>: ').split()
if asked[0].upper() == "GO":
asked[1] = asked[1].capitalize()
if asked[1][0] == 'North' or asked[1][0] == 'South' or asked[1][0] == 'East' or asked[1][0] == 'West':
return asked[1]
else:
continue
elif asked[0].upper() == 'GET':
if asked[1].upper() == item.upper():
return item
else:
continue
# show the current status
def input_status(currentLocation, inventory, currentItem):
# print the players current location
print('Your current location is: ', currentLocation)
# print the players inventory options
print('Your inventory so far is: ', inventory)
# print an item if there is one
print('Your current item is: ', currentItem)
print()
# print out the locations
locations = {
'Transport Rover': {'North': 'Watch Tower', 'South': 'Landing Site1',
'East':
'Weapon Storage Facility', 'West': 'Launch Site'},
'Watch Tower': {'North': 'Transport Rover', 'East': 'Storage Room',
'item':
'Key Card'},
'Storage Room': {'West': 'Watch Tower', 'item': 'Flashlight'},
'Landing Site1': {'South': 'Transport Rover', 'East': 'Landing Site2',
'item':
'Transport Cage'},
'Landing Site2': {'East': 'Landing Site1', 'item': 'Energy Cells'},
'Testing Facility': {'West': 'Landing Site1', 'East': 'Testing Facility',
'item': 'Asset(Alien)'}, # Creature
'Weapon Storage Facility': {'East': 'Transport Rover', 'North': 'Medical Wing', 'item': 'Laser Guns'},
'Medical Wing': {'South': 'Weapon Storage Facility', 'item': 'Medical Supplies'},
'Launch Site': {'West': 'Transport Rover', 'item': 'Ammo'}
}
# print out the what each location has
storage = {
'Watch Tower': 'Key Card',
'Storage Room': 'Flashlight',
'Landing Site1': 'Transport Cage',
'Landing Site2': 'Energy Cells',
'Testing Facility': 'Asset(Alien)',
'Weapon Storage Facility': 'Laser Guns',
'Medical Wing': 'Medical Supplies',
'Launch Site': 'Ammo',
}
# input your current location
where = 'Transport Rover'
what = []
while True:
input_status(where, what, locations[where])
ans = input_instructions(locations[where])
if ans == locations[where]:
what.append(ans)
continue
else:
if ans in locations[where]:
where = locations[where][ans]
if where == 'Testing Facility':
print('You are now fighting the Alien...')
if len(what) > 3:
print('...')
print('Mission accomplish you and your team have capture the Asset(Alien)!')
else:
print('...')
print('Mission Failed')
break
else:
print('pass')
Related
I need to add a function that displays the current possible moves. I am at a loss on how to do this. I also have a problem with a print statement occurring when I don't want it to. If I enter the "get item" input, it prints the "You can't do that." statement. That statement should only be for invalid commands. I am very new to Python and don't really understand much of what I am doing. Please help.
# Dictionary for rooms and directions
rooms = {
'Living Room': {'West': 'Garage', 'East': 'Kitchen', 'North': 'Bedroom', 'South': 'Den', 'item': 'None'},
'Garage': {'East': 'Living Room', 'item': 'Candle'},
'Bedroom': {'East': 'Bathroom', 'South': 'Living Room', 'item': 'Lighter'},
'Bathroom': {'West': 'Bedroom', 'item': 'Mirror'},
'Kitchen': {'North': 'Pantry', 'West': 'Living Room', 'item': 'Bowl of water'},
'Pantry': {'South': 'Kitchen', 'item': 'Salt'},
'Den': {'East': 'Basement', 'North': 'Living Room', 'item': 'Spellbook'},
'Basement': {'West': 'Den', 'item': 'None', 'villain': 'Ghost'}
}
current_room = 'Living Room' # Starting room
# Game instructions
def instructions():
print('Collect all 6 items and defeat the ghost!')
print('To move rooms, type: "North, South, East, or West".')
print('To collect items, type: "get _item_".')
print('To exit game, type: "Exit".')
# Player status
def show_status(current_room, inventory):
print('----------------------')
print('Your are in the', current_room)
print('Inventory: ', inventory)
print('You found {}'.format(rooms[current_room]['item']))
print('----------------------')
def move_rooms(current_room, direction): # Loop for location
current_room = rooms[current_room]
new_room = current_room[direction]
return new_room
instructions()
direction = ['North', 'South', 'East', 'West']
inventory = []
# Game loop
while True:
show_status(current_room, inventory)
direction = input('\nWhat do you want to do?: ')
if current_room in ['Basement']: #Boss room loop
if len(inventory) == 6:
print('You cast a spell and freed the ghost! You win!')
else:
print('The ghost attacks you! You lose!')
break
item = rooms[current_room].get('item') # get the current item, or None if there isn't one
if item is not None and direction == 'get ' + item:
if item in inventory:
print('You already have this item in your inventory!')
else:
inventory.append(item)
if direction in rooms[current_room]: #valid move
current_room = move_rooms(current_room, direction)
if direction == 'Exit': # Exit game
print('Thanks for playing!')
break
I've never posted on here so I'll do my best to format everything correctly. I am writing a text-based Python game for school that involves collecting items and a villain. The villain is designed to end the game if encountered. I wanted to randomize the villain's location between a 'window' and 'front door' option, making the end random chance if you win or lose. (see FIXME) Secondly, I was having trouble separating the text that displays when you enter a room and the text regarding collectibles. I was trying to make it so that once an item is collected the collectible text no longer displays as that item is no longer in the room after it is collected. I was having a lot of trouble with this under the comment #look around. Thank you in advance for the help :P
rooms = {
'Outside': {'name': 'Outside', 'North': 'Dining Room',
'text': 'You are outside and stare at the back door to the house.'},
'Dining Room': {'name': 'Dining Room', 'North': 'Living Room', 'contents': ['vase'],
'West': 'Kitchen', 'text': 'You are in the dining room.', 'item_get': 'There is a vase in this room... It looks valuable.'},
'Kitchen': {'name': 'Kitchen', 'East': 'Dining Room', 'contents': 'Blender',
'text': 'You are in the kitchen. There is a blender on the counter.'},
'Living Room': {'name': 'Living Room', 'South': 'Dining Room', 'East': 'Stairs', 'West': 'Bathroom', 'contents': ['TV'],
'text': 'You are in the Living room. There is a TV on the wall.'},
'Bathroom': {'name': 'Bathroom', 'East': 'Living Room', 'contents': ['Candle'],
'text': 'You are in the Bathroom. There is a candle on the counter.'},
'Stairs': {'name': 'Stairs', 'North': 'Hallway', 'West': 'Living Room',
'text': 'You are in the stairway. There is a hallway at the top.'},
'Hallway': {'name': 'Hallway', 'East': 'Bedroom', 'West': 'Kids Bedroom',
'text': 'You are in the hallway. There are bedrooms on either side of you.'},
'Bedroom': {'name': 'Bedroom', 'West': 'Hallway', 'contents': ['Jewelry'],
'text': 'You are in the bedroom. There is jewelry on the dresser.'},
'Kids Bedroom': {'name': 'Kids Bedroom', 'East': 'Hallway', 'contents': ['Music box'],
'text': 'You are in a kids bedroom. There is a music box on a shelf.'},
#FIXME: ESCAPE ROUTES
#is there a way to randomize where the villain will be between two exit options?
}
directions = ['North', 'South', 'East', 'West']
items = ['look around']
look_around = ['item_get']
currentRoom = rooms['Outside']
carrying = []
print('Hello. You are outside')
while True:
# display current location
print()
print(format(currentRoom['text']))
# get input
command = input('\nWhat next? ').strip()
# movement
if command in directions:
if command in currentRoom:
currentRoom = rooms[currentRoom[command]]
else:
print("You can't go that way.")
#look around
if command in items:
if command in look_around:
look_around = rooms[items[command]]
else:
print("There is nothing to see.")
# quit game
elif command.lower() in ('e', 'exit'):
break
elif command.lower().split()[0] == 'get':
item = command.lower().split()[1]
if item in currentRoom['contents']:
carrying.append(item)
print('You stole the {}!'.format(currentRoom['contents']))
else:
print("That object is not in this room.")
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()
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.
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)
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)
I have a text-based game using python. My issue is that I can't move between rooms due to a variable not getting changed like it needs to.
I've used global and that results in another error. The code is as follows:
#The dictionary links a room to other rooms and items.
rooms = {
'Holding Cell': {'South': 'Training room','North': 'Cupboard', 'West': 'Study' },
'Cupboard': {'South': 'Holding Cell', 'Item': 'Health Potion'},
'Study': {'West': 'Armory', 'East': 'Holding Cell', 'Item': 'Mind key'},
'Armory': {'East': 'Study', 'Item': 'Sword and shield'},
'Training room': {'North': 'Holding Cell', 'East': 'Storage room', 'Item': 'Body key'},
'Storage room': {'West': 'Training room', 'Item': 'Armor set'},
'Prayer room': {'North': 'Dungeon Exit', 'Item': 'Soul key'},
'Dungeon Exit': {}
}
starting_room = 'Holding Cell'
current_room = starting_room
inventory = []
inventory1 = ['Health Potion', 'Sword and shield', 'Mind key', 'Soul key', 'Armor set', 'Body key']
inventory1.sort()
health = 100
def status():
inventory.sort()
print('-----------------------------')
print("Inventory: ", inventory)
print("Health: ", str(health))
print("Current room: ", current_room)
def main():
rooms = {
'Holding Cell': {'South': 'Training room', 'North': 'Cupboard', 'West': 'Study'},
'Cupboard': {'South': 'Holding Cell', 'Item': 'Health Potion'},
'Study': {'West': 'Armory', 'East': 'Holding Cell', 'Item': 'Mind key'},
'Armory': {'East': 'Study', 'Item': 'Sword and shield'},
'Training room': {'North': 'Holding Cell', 'East': 'Storage room', 'Item': 'Body key'},
'Storage room': {'West': 'Training room', 'Item': 'Armor set'},
'Prayer room': {'North': 'Dungeon Exit', 'Item': 'Soul key'},
'Dungeon Exit': {}
}
status()
current_room = starting_room
direction = input("Enter 'North/South/East/West' to move or 'Exit': ")
# user to exit
if direction == 'Exit':
print("Thanks for playing!")
exit(0)
# a valid move
elif direction in rooms[current_room]:
current_room = rooms[current_room][direction]
# invalid move
else:
print("Invalid Move. There's no room to the {}".format(direction))
def show_instructions():
print("Type 'North', 'South', 'East', 'North' to go in a direction. Type 'Exit' to leave the game!")
print("To get an item type 'Get (item).")
#provides instructions to player
show_instructions()
while 1:
main()
First problem: Use global correctly within the main function.
def main():
status()
global current_room # <--- here
current_room = starting_room # this is already defined outside the function, so really isn't needed
direction = input("Enter 'North/South/East/West' to move or 'Exit': ")
if direction == 'Exit':
print("Thanks for playing!")
exit(0)
elif direction in rooms[current_room]:
current_room = rooms[current_room][direction]
else:
print("Invalid Move. There's no room to the {}".format(direction))
Second problem: you are constantly resetting the current_room = starting_room each time through the main function, and not maintaining your state correctly.
The fix for that seems to be removing that line and just prompting for the direction input, and letting the flow pass to the elif block.