1

My code is a text based adventure program however, when i am running it and it tries to use variables it breaks since the variables are not getting added to the def as python defines things before it does anything else.

This is my code and the program breaks when you go north twice and open window and enter window and up or east

    import time
reset = "yes"
def print_slow(str):
    for letter in str:
        print(letter),
        time.sleep(.3)

def game():
    #This sets the commands to be used
    inv_command = ["inv", "inventory", "i"]
    west = ["west", "w", "go west", "walk west"]
    east = ["east", "e", "go east", "walk east"]
    north = ["north", "n", "go north", "walk north"]
    south = ["south", "s", "go south", "walk south"]
    northeast = ["northeast", "ne", "go northeast", "walk northeast"]
    northwest = ["northwest", "nw", "go northwest", "walk northwest"]
    southeast = ["southeast", "se", "go southeast", "walk southeast"]
    southwest = ["southwest", "sw", "go southwest", "walk southwest"]
    up = ["up", "u", "go up", "go up stairs", "go up ladder", "up stairs", "up ladder"]
    down = ["down", "d", "go down", "go down stairs", "go down ladder", "down stairs", "down ladder"]
    take = ["take", "t"]
    die = ["die","suicide", "kill myself","kill"]
    #This sets the objects
    mailbox = 1
    house_window = 0
    house_bag = 0
    knife = 0
    lamp = 0
    carpet = 0
    rug = 0
    light = 0
    trapdoor =0
    #This sets the inventory
    class Item(object):
        def __init__(self, name, attack, armour):
            self.name = name
            self.attack = attack
            self.armour = armour

    class Inventory(object):    
        def __init__(self):
            self.items = {}

        def add_item(self, item):
            self.items[item.name] = item

        def contain_item(self, item):
            self.items["Leaflet"] = item

        def print_items(self):
            print('\t'.join(['Name', 'Atk', 'Arm']))
            for item in self.items.values():
                print('\t'.join([str(x) for x in [item.name, item.attack, item.armour]]))
            time.sleep(1)    
    inventory = Inventory()
    class death():
        def kill():
            print("You killed yourself")
            reset()
    game = 1
    still_running = 1
    while game is still_running:
        #This is the spawn area
        def spawn():
            while game is still_running:
                inp = input("You wake up in a field surrounded by trees. The only pathway is going north \n>")
                if inp in north:
                    front_house()
                if inp in die:
                    game.reset()
                elif inp in inv_command:
                    inventory.print_items()
                else:
                    print("<You can't do that>")

            #This is the front of the house
        def front_house():
            while game is still_running:
                inp = input("You face the front of a house. The windows are boarded up and the door is closed. In front there is a mailbox, and pathways leading west and further north\n>")
                if inp in south:
                    spawn()
                elif inp in inv_command:
                    inventory.print_items()
                elif inp in north:
                    back_house()
                elif inp in west:
                    west_forest_entrance()
                elif inp in "open door":
                    print("<The door is locked>")
                elif inp in "open window":
                    print("<The windows can't be opened. They seem to be nailed shut>")
                elif inp in "read leaflet":
                    if inventory.contain_item:
                        print("<Welcome to the text based adventure!>")
                        print("<When typing commands, please don't use capital letters.>")
                        print("<have fun!>")
                    else:
                        print("<You don't have a leaflet>")
                elif inp in "open mailbox":
                    if mailbox == 1:
                        print("<The mailbox contains a leaflet>")
                    else:
                        print("<The mailbox is empty>")
                elif inp in "take leaflet":
                    if mailbox == 1:
                        inventory.add_item(Item('Leaflet', 0, 0))
                        mailbox = 0
                        print("<You have taken the leaflet>")
                    else:
                        print("<There's no leaflet in the mailbox>")   
                else:
                    print("<You can't do that>")

        #This is the back of the house
        def back_house():
            while game is still_running:
                inp = input("You face the back of the house, which has nothing except one ajar window. There is another pathway heading east \n>")
                if inp in inv_command:
                    inventory.print_items()
                if inp in south:
                    front_house()
                if inp == "open window":
                    house_window = 1
                    print("<You opened the window enough for you to enter through>")
                if inp == "enter window":
                    if house_window == 1:
                        kitchen()
                    else:
                        print("<The window isn't opened enough to fit through>")
                else:
                    print("<You can't do that>")

        #This is the kitchen
        def kitchen():
            while game is still_running:
                inp = input("You are inside the kitchen of the house. On the table there is a bag, there is a staircase leading up stairs and to the east there is a living room \n>")
                if inp in inv_command:
                    inventory.print_items()
                elif inp in "read manual":
                    if inventory.contain_item:
                        print("<Commands - inventory, take, open, attack>")
                        print("<Moving commands - go north, go south, go northeast, go northwest, go southeast, go southwest, up, down.>")
                        print("<Good luck!>")
                elif inp in up:
                    attic()
                elif inp in east:
                    living_room()
                elif inp in "exit window":
                    back_house()
                elif inp == "open bag":
                    print("<The bag contains a manual>")
                elif inp == "take bag":
                    print("<You would much rather take what's inside the bag then the bag itself>")
                elif inp == "take manual":
                    if house_bag == 0:
                        print("<You took the manual>")
                        house_bag = 1
                        inventory.add_item(Item('manual', 0, 0))
                    else:
                        print("<You have already taken the manual>")
                else:
                    print("<You can't do that>")

        #This is the Attic of the house
        def attic():
            while game is still_running:
                if knife == 0:
                    if lamp == 0:
                        inp = input("You are in the attic, you can see a lamp and a knife. You see blood stains and stairs downwards \n>")
                    else:
                        inp = input("You are in the attic, you can see a knife. You see blood stains and stairs downwards \n>")
                elif knife == 1:
                    if lamp == 0:
                        inp = input("You are in the attic, you can see a lamp. You see blood stains and stairs downwards \n>")
                    else:
                        inp = input("You are in the attic. You see blood stains and stairs downwards \n>")
                if inp in inv_command:
                    inventory.print_items()
                elif inp in down:
                    kitchen()
                elif inp in "take knife":
                    if knife == 0:
                        print("You pulled the knife out from the wall and put it in your pocket")
                        print("<You have obtain a knife>")
                        knife = 1
                        inventory.add_item(Item('knife', 3, 0))
                    else:
                        print("<You have already taken the knife>")
                elif inp in "take lamp":
                    if lamp == 0:
                        print("<You have taken the lamp>")
                        lamp = 1
                        inventory.add_item(Item('lamp', 0,0))
                    else:
                        print("<You have already taken the lamp>")
                else:
                    print("<You can't do that>")
        #This is the living room
        def living_room():
            while game is still_running:
                if rug == 0:
                    inp = input("You are in the living room and you see a rug on the floor.\n>" )
                if rug == 1:
                    inp = input("You are in the living room and you can see a trap door.\n>")
                if inp == "move rug":
                    rug = 1
                    print("<You have found a trap door to the basement>")
                if trapdoor == 1:
                    if inp in down:
                        underground_entrance()
                if inp in inv_command:
                    inventory.print_items()
            else:
                print("<You can't do that>")
        #This is the underground entrance
        def underground_entrance():
            while game is still_running:
                if lamp == 1:
                    if light == 0:
                        inp = input("It is dark, you can't see anything.\n>")
                        if inp in up:
                            living_room()
                        if inp in inv_command:
                            inventory.print_items()
                        if inp == "turn on lamp" or "turn lamp on":
                            print("<You turned on the lamp>")
                            light = 1
                        else:
                            print("<You can't do that>")
                    if light == 1:
                        inp = input("You are below the living room, where you can see a entrance to a underground tunnel north of you.\n>")
                        if inp in up:
                            living_room()
                        if inp in inv_command:
                            inventory.print_items()
                        if inp in north:
                            loop = 12
                    else:
                        print("<You can't do that>")
                if lamp == 0:
                    inp = input("It is dark, you can't see anything you need to find a lamp.\n>")
                    if inp in up:
                        living_room()
                    if inp in inv_command:
                        inventory.print_items()
                else:
                    print("<You can't do that>")



                #This is the west forest entrance
                def west_forest_entrance():
                    while game is still_running:
                        inp = input("You are now in a dense forest. There is a fork in the road going NorthWest and SouthWest \n>")
                        if inp in inv_command:
                            inventory.print_items()
                        elif inp in east:
                            loop = 2
                        elif inp in northwest:
                            loop = 6
                        elif inp in southwest:
                            loop = 7
                        else:
                            print("<You can't do that>")
        spawn()
def reset():
    if reset == "yes":
        print_slow("Resetting...")
        print_slow("Loading...")
        time.sleep(5)
        game()
game()
  • 1
    You have an un-needed tab at the very first line. Otherwise, would be nice to know what is the problem. What do you mean by break? At which line? – Dror Aug 31 '17 at 04:23
  • 1
    The way you are using functions doesn't make a lot of sense. You should start with the basics (maybe the [Python tutorial](https://docs.python.org/3/tutorial/)). – BrenBarn Aug 31 '17 at 04:23

1 Answers1

0

Many of your defs are nested inside the game() function. You appear to be trying to use the local variables of game as quasi-global variables.

If you are going to do that, you need to declare the variables you wish to use as nonlocal in the nested functions.

For example: See this answer for an example of nonlocal.

Alternatively, you may wish to move the variables to be truly global, put the definitions at the outermost scope, and declare the ones you wish to modify in functions with the global statement.

For example: See this answer for an example of 'global'.

Or, you might make all those functions methods on a class, and use self.mailbox and self.window instead of mailbox or window.

For example:

class Game:
    def __init__(self):
        self.mailbox_full = True

    def take_leaflet(self):
        if self.location != FRONT_HOUSE:
            self.bogus()
            return

        if self.mailbox_full:
            self.inventory.add_item(Item('Leaflet', 0, 0))
            self.mailbox_full = False
            self.msg('You take the leaflet')
        else:
            self.msg('There is no leaflet in the mailbox.')
aghast
  • 14,785
  • 3
  • 24
  • 56
  • thank you however, what would be the best place to put it in my code and can you also give me an example. – Daniel Ryan Aug 31 '17 at 04:49
  • I've added an example and some links. The "best place to put it" depends on what "it" is - there's three choices. – aghast Aug 31 '17 at 07:24