2017-08-31 77 views
1

我的代碼是基於文本的冒險節目然而,當我運行它,它會嘗試使用它打破自變量沒有得到添加到高清的蟒蛇變量在做其他事情之前對事物進行定義。使用「高清」時的Python 3.x的破碎變量法

這是我的代碼和程序中斷,當你往北走兩次,打開窗口,進入窗口,向上或東

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

你必須在第一行的聯合國需要標籤。否則,很高興知道問題是什麼。休息是什麼意思?在哪一行? – Dror

+1

您使用功能的方式不會使一個很大的意義。你應該從基礎開始(可能是[Python教程](https://docs.python.org/3/tutorial/))。 – BrenBarn

回答

0

您的許多DEFS的嵌套在game()函數內。你似乎是欲以game局部變量作爲準全局變量。

如果你要做到這一點,你需要聲明你想作爲嵌套函數nonlocal使用的變量。

例如:有關nonlocal的示例,請參閱this answer

或者,您可能希望將變量移動到真正的全局範圍,將定義放在最外面的範圍,然後在global語句中聲明您希望修改的函數。

例如:查看this answer查看「global」的示例。

或者,你可能會做出一個類中的所有這些功能的方法,並使用self.mailboxself.window而不是mailboxwindow

例如:

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

然而,謝謝你,最好的地方放在我的代碼中,你可以給我一個例子。 –

+0

我添加了一個例子,一些鏈接。 「放置它的最佳地點」取決於「它」是什麼 - 有三種選擇。 –