Part 6: Take things
Contents
Part 6: Take things#
In this section we’ll add the take command.
Part 6.1: Add command#
In this section we’ll define a do_take() function that gets called when the
player types t, take, or grab.
Demo
A: Define do_take()#
[ ]Define ado_take()function.[ ]In it, use thedebug()function to print something like"Trying to take: args.".
Code
257def do_take(args):
258 """Pick up an item and add it to inventory."""
259 debug(f"Trying to take: {args}")
260
B: Modify main(), in the while loop#
[ ]Add anelifthat checks ifcommandis"t","take"or"grab".[ ]if so, calldo_take()
Code
276 if command in ["q", "quit", "exit"]:
277 do_quit()
278
279 elif command in ("shop"):
280 do_shop()
281
282 elif command in ("g", "go"):
283 do_go(args)
284
285 elif command in ("x", "exam", "examine"):
286 do_examine(args)
287
288 elif command in ("l", "look"):
289 do_look()
290
291 elif command in ("t", "take", "grab"):
292 do_take(args)
293
294 else:
295 error("No such command.")
296 continue
Part 6.2: Validate item#
In this section we’ll check to make sure that the player entered a valid, takeable item in the current place.
Demo
A: Modify ITEMS#
[ ]For any item you wish for the player to be able totake, add"can_take": Trueto the items dictionary.
Code
61 "book": {
62 "key": "book",
63 "can_take": True,
64 "name": "a book",
65 "description": (
66 "A hefty leather-bound tome open to an interesting passage."
67 ),
68 },
B: Modify do_take(): make sure the item is valid in the current place#
[ ]Check to see ifargsis falsy, if so:[ ]Use theerror()function to print a message saying:"Which way do you want to go?"[ ]return
[ ]get the value fromPLAYERassociated with the"place"key and assign it toplace_name[ ]get the value fromPLACESassociated withplace_nameand assign it toplace[ ]assign the first item of theargslist to the variablenameand make it lowercase[ ]Get the list of items in theplacedictionary using.get()with a default value of[]. Check to see ifnameis in the list. If not:[ ]Print an error message like:"Sorry, I don't see a name here."[ ]return
Code
258def do_take(args):
259 """Pick up an item and add it to inventory."""
260 debug(f"Trying to take: {args}")
261
262 # make sure the player typed an item
263 if not args:
264 error("What do you want to take?")
265 return
266
267 # get the item name from arguments
268 # and make it lowercase
269 name = args[0].lower()
270
271 # look up where the player is now
272 place_name = PLAYER["place"]
273 place = PLACES[place_name]
274
275 # make sure the item is in this place
276 if name not in place.get("items", []):
277 error(f"Sorry, I don't see a {name!r} here.")
278 return
279
C: Modify do_take(): make sure the item is takeable#
[ ]Using.get(), get the value fromITEMSassociated with thenamekey and assign it to the variableitem.[ ]Ifitemis falsy,[ ]Print an error message like:"Woops! The information about name!r seems to be missing."[ ]return
[ ]Using.get(), get the value fromitemassociated with the"can_take"key. Check to see if it is falsy. If so:[ ]Usewrap()to print a message like:"You try to pick up item['name'], but you find you aren't able to lift it."[ ]return
Code
258def do_take(args):
259 """Pick up an item and add it to inventory."""
260 debug(f"Trying to take: {args}")
261
262 # make sure the player typed an item
263 if not args:
264 error("What do you want to take?")
265 return
266
267 # get the item name from arguments
268 # and make it lowercase
269 name = args[0].lower()
270
271 # look up where the player is now
272 place_name = PLAYER["place"]
273 place = PLACES[place_name]
274
275 # make sure the item is in this place
276 if name not in place.get("items", []):
277 error(f"Sorry, I don't see a {name!r} here.")
278 return
279
280 # get the item information
281 item = ITEMS.get(name)
282
283 # make sure the item is in the ITEMS dictionary
284 if not item:
285 error(f"Woops! The information about {name!r} seems to be missing.")
286 return
287
288 if not item.get("can_take"):
289 wrap(f"You try to pick up {item['name']}, but you find you aren't able to lift it.")
290 return
291
Part 6.3: Take it#
In this section we’ll actually take the item.
Demo
A: Modify PLAYER#
[ ]Add"inventory": {}to thePLAYERdictionary.
Code
17PLAYER = {
18 "place": "home",
19 "inventory": {},
B: Modify do_take()#
In this section we will add the item to our inventory, remove it from the place, and let the player know that it’s done.
[ ]Call.setdefault()onPLAYER["inventory"]with the argumentsnameand0.This will set the current inventory for
nameto0if it is not already in our inventory.[ ]Add1toPLAYER["inventory"][name][ ]Removenamefrom theplace["items"]list using the.remove()method[ ]Use thewrap()function to print a message like:"You pick up name and put it in your pack."
Code
259def do_take(args):
260 """Pick up an item and add it to inventory."""
261 debug(f"Trying to take: {args}")
262
263 # make sure the player typed an item
264 if not args:
265 error("What do you want to take?")
266 return
267
268 # get the item name from arguments
269 # and make it lowercase
270 name = args[0].lower()
271
272 # look up where the player is now
273 place_name = PLAYER["place"]
274 place = PLACES[place_name]
275
276 # make sure the item is in this place
277 if name not in place.get("items", []):
278 error(f"Sorry, I don't see a {name!r} here.")
279 return
280
281 # get the item information
282 item = ITEMS.get(name)
283
284 # make sure the item is in the ITEMS dictionary
285 if not item:
286 error(f"Woops! The information about {name!r} seems to be missing.")
287 return
288
289 if not item.get("can_take"):
290 wrap(f"You try to pick up {item['name']}, but you find you aren't able to lift it.")
291 return
292
293 PLAYER["inventory"].setdefault(name, 0)
294 PLAYER["inventory"][name] += 1
295 place["items"].remove(name)
296
297 wrap(f"You pick up {item['name']} and put it in your pack.")
Part 6.4: Examine inventory#
In this section we’ll modify do_examine() so it can be used to look at inventory items.
Demo
A: Modify do_examine()#
[ ]Find the if statement where you check ifnameis not in theplaceitems list. Modify it so that it shows the error ifnameis not inplaceitems andnameis not inPLAYER["inventory"].
Code
178def do_examine(args):
179 """Look at an item in the current place."""
180
181 debug(f"Trying to examine: {args}")
182
183 # make sure the player said what they want to examine
184 if not args:
185 error("What do you want to examine?")
186 return
187
188 # look up where the player is now
189 place_name = PLAYER["place"]
190 place = PLACES[place_name]
191
192 # get the item entered by the user and make it lowercase
193 name = args[0].lower()
194
195 # make sure the item is in this place or in the players inventory
196 if not (name in place.get("items", []) or name in PLAYER["inventory"]):
197 error(f"Sorry, I don't know what this is: {name!r}.")
198 return
199