So I am trying to design a text based adventure game for one of my classes. I have the movement from room to room down, but have been struggling when it comes to getting items added to the inventory for the escape. At first when I tried to enter "get 'item'" I was prompted with 'invalid move' which was happening because there was an issue with the sequence I was calling my functions. Now that I have everything fixed, the items are automatically being added to the inventory without the user entering the get item function, and every time you enter a room, the item is being added despite it already being in the inventory. Here is my code:
def show_instructions():
print('Escape From Work Text Based Game')
print('Movement commands: South, North, East, West')
print("To pick up an item, type 'get [item]'")
print()
print('Your boss is asking you to come in on your days off. To escape without being seen, you will need to get your'
' vest, backpack, lunchbox, paycheck, name badge, and car keys.')
print('Do not enter the room that has your boss, or you can kiss your days off goodbye!')
def player_stat(current_room, inventory):
print('----------------------')
print('You are in the {}'.format(current_room))
print('Item in this room: {}'.format(rooms[current_room]['Item']))
print('Inventory: ', inventory)
print('----------------------')
def move(direction, current_room, rooms):
if direction in rooms[current_room]:
current_room = rooms[current_room][direction]
else:
print('You run into the wall, customers are staring. Try again.')
return current_room
rooms = {
'Garden Center': {'South': 'Hardware Dept.', 'West': 'Customer Service', 'North': 'HR Office',
'East': 'Storage Room', 'Item': 'None'},
'Customer Service': {'East': 'Garden Center', 'Item': 'lunchbox'},
'Hardware Dept.': {'East': 'Break Room', 'North': 'Garden Center', 'Item': 'backpack'},
'HR Office': {'East': 'Lounge', 'South': 'Garden Center', 'Item': 'paycheck'},
'Lounge': {'West': 'HR Office', 'Item': 'name badge'},
'Break Room': {'West': 'Hardware Dept.'},
'Storage Room': {'West': 'Garden Center', 'North': 'Admin Office', 'Item': 'vest'},
'Admin Office': {'South': 'Storage Room', 'Item': 'keys'}
}
directions = ['North', 'East', 'South', 'West']
current_room = 'Garden Center'
inventory = []
show_instructions()
while current_room != 'Exit':
player_stat(current_room, inventory)
player_move = input('What is your command?: ').lower().title()
if player_move == 'exit':
current_room = 'Exit'
print('Sorry to see you go, play again soon!')
elif player_move in directions:
current_room = move(player_move, current_room, rooms)
item = rooms[current_room].get('Item')
if item is not None and player_move == 'get ' item:
if item in inventory:
print('You already have this item in your inventory!')
else:
inventory.append(item)
if current_room == 'Break Room':
print('Oh no! You got caught. Have fun working this weekend.')
exit()
else:
print('Invalid move')
And this is what the output looks like after I have moved from a few of the rooms. I don't understand why it is printing invalid move after every move even if it is valid either.
You are in the HR Office
Item in this room: paycheck
Inventory: ['paycheck', 'paycheck']
----------------------
Where would you like to go?: south
Invalid move
----------------------
You are in the Garden Center
Item in this room: None
Inventory: ['paycheck', 'paycheck', 'None']
----------------------
Where would you like to go?: south
Invalid move
----------------------
You are in the Hardware Dept.
Item in this room: backpack
Inventory: ['paycheck', 'paycheck', 'None', 'backpack']
----------------------
I also still have to add a way to exit the game when you win after collecting all 6 items, and i was heading in the direction of 'if inventory == [ all 6 items in list ]: print( you win) followed by exit' Any help anyone has to offer would be greatly appreciated.
CodePudding user response:
Try
#Loop continues if user has not entered 'exit' or inventory is not up to 6 items
while current_room != 'Exit' and len(inventory)!= 6:
player_stat(current_room, inventory)
player_move = input('What is your command?: ').lower().title()
if player_move == 'Exit':
current_room = 'Exit'
print('Sorry to see you go, play again soon!')
exit()
elif player_move in directions:
current_room = move(player_move, current_room, rooms)
item = rooms[current_room].get('Item')
#As the input has .title() this condition will accept input of item in that format
if item is not None and player_move == 'Get ' item.title():
if item in inventory:
print('You already have this item in your inventory!')
#Was adding repeat items because of prior incorrect indentation
#Correct indentation with the else applying after checking inventory
else:
inventory.append(item)
if current_room == 'Break Room':
print('Oh no! You got caught. Have fun working this weekend.')
exit()
#Replaced the 'else' statement with this so the console doesn't return 'Invalid move' every time
if "get " item not in player_move and player_move not in directions:
print('Invalid move')
#When loop breaks, user will have won
print("You won!")
CodePudding user response:
Your indentation is wrong. You have this:
if item is not None and player_move == 'get ' item:
if item in inventory:
print('You already have this item in your inventory!')
else:
inventory.append(item)
but I think you want this:
if item is not None and player_move == 'get ' item:
if item in inventory:
print('You already have this item in your inventory!')
else:
inventory.append(item)