I'm building a simple mansion escape game in Python. The player can move between rooms, pick up a golden key, and drop it in another room. However, after entering the commands `e`, `e`, `get key`, `e`, and `drop key`, the key still appears to be in room 2 instead of room 3. The game also fails to print that the key is on the floor in room 3.
I use `player_position` to track the player's room, `got_key` to track whether the player is carrying the key, and `key_location` to track the key when it is not being carried. I added a `check_n_update_key` function to update the key's location, but the logic does not seem to work. I suspect the problem is in that function. I'd also appreciate suggestions for debugging logic errors like this more effectively.
4 Answers
You may not need to update the key’s location continuously while the player is carrying it. `got_key` already tells you that the key is in the player’s inventory. When the player drops it, set `key_location` to the current room and set `got_key` to `False`. That makes the state easier to reason about. Your drop branch currently returns only a Boolean, so it has no way to change `key_location` directly.
For debugging, print the state immediately before and after each command, especially `player_position`, `got_key`, and `key_location`. A debugger or a linter can also catch common mistakes like using `==` where `=` was intended. Once the program grows, dictionaries for room descriptions or small `Player` and `Key` classes can make the state easier to manage, but fixing the assignment operator is the main issue here.
The immediate bug is here: `key_location == player_position`. The double equals operator compares two values; it does not assign anything. Use `key_location = player_position` instead. Since integers are immutable and the function receives its own local variable, return the updated value and assign it back in the main loop, as you already do: `key_location = check_n_update_key(...)`.
A cleaner approach is to have the interaction function return both pieces of state. For example, when dropping the key, return `(False, player_position)`, and when picking it up, return `(True, key_location)` or leave the location unchanged while it is carried. Then assign both returned values in the loop. This avoids hidden state changes and makes each command’s effect explicit.

That was it—thank you! I was accidentally comparing the values instead of updating the key’s location.