首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“def”方法时Python3.x中断变量

使用“def”方法时Python3.x中断变量
EN

Stack Overflow用户
提问于 2017-08-31 04:19:24
回答 1查看 56关注 0票数 1

然而,我的代码是一个基于文本的冒险程序,当我运行它时,它尝试使用它中断的变量,因为这些变量没有被添加到def中,因为python在做任何其他事情之前定义了一些事情。

这是我的代码,当你向北走两次,打开窗口,输入窗口,向上或东方时,程序就会中断。

代码语言:javascript
复制
    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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 04:29:31

您的许多防御系统都嵌套在game()函数中。您似乎试图使用game的局部变量作为准全局变量。

如果要这样做,则需要在嵌套函数中声明希望作为nonlocal使用的变量。

例如,参见this answer中的nonlocal示例。

或者,您可能希望将变量移动到真正全局的位置,将定义放在最外层的范围,并使用global语句在函数中声明要修改的定义。

例如,参见this answer中的“全局”示例。

或者,您可以在类上创建所有这些函数方法,并使用self.mailboxself.window代替mailboxwindow

例如,

代码语言:javascript
复制
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.')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45973176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档