2015-01-26 3 views
-1

У меня есть два раздела кода Python - один работает, а другой - с ошибкой. Какое правило делает это в этом случае?Почему этот кусок кода возникает с ошибкой, а другой нет?

Вот кусок кода, который получил ошибку, наряду с сообщением об ошибке:

Код:

elif door == "2": 
    print "You stare into the endless abyss at Cthulhu's retina." 
    print "1. blueberries." 
    print "2. Yellow jacket clothespins." 
    print "3. Understanding revolvers yelling melodies." 

    insanity = raw_input("> ") 

    if insanity == "1" or insanity == "2": 
     print "Your body survives powered by a mind of jello. Good job!" 
     print "Now what will you do with the jello?" 
     print "1. Eat it." 
     print "2. Take it out and load it in a gun." 
     print "3 Nothing." 

     jello = raw_input("> ") 

     if jello == "1" or jello == "2": 
      print "Your mind is powered by it remember? Now you are dead!" 
     elif jello == "3": 
      print "Smart move. You will survive." 
     else: 
      print "Do something!" 

else: 
    print "The insanity rots your eyes into a pool of muck. Good job!" 

Я получил сообщение об ошибке в строке:

File "ex31.py", line 29 
    print "Now what will you do with the jello?" 
             ^
IndentationError: unindent does not match any outer indentation level 

НО когда мой код выглядит следующим образом:

elif door == "2": 
print "You stare into the endless abyss at Cthulhu's retina." 
print "1. blueberries." 
print "2. Yellow jacket clothespins." 
print "3. Understanding revolvers yelling melodies." 

insanity = raw_input("> ") 

if insanity == "1" or insanity == "2": 
    print "Your body survives powered by a mind of jello. Good job!" 
     print "Now what will you do with the jello?" 
     print "1. Eat it." 
     print "2. Take it out and load it in a gun." 
     print "3 Nothing." 

     jello = raw_input("> ") 

     if jello == "1" or jello == "2": 
      print "Your mind is powered by it remember? Now you are dead!" 
     elif jello == "3": 
      print "Smart move. You will survive." 
     else: 
      print "Do something!" 

else: 
    print "The insanity rots your eyes into a pool of muck. Good job!" 

У меня нет сообщения об ошибке.

В основном мой вопрос - почему я не получаю сообщение об ошибке, если я отступа строки

print "Now what will you do with the jello?" 

... и остальную часть блока кода ниже него.

Но я получаю код ошибки, если оставляю его с тем же отступом, что и линия над ним?

Означает ли это, что строка печати после оператора if может содержать только одну строку, при этом никакие другие строки печати не могут быть связаны с выходом инструкции if над первой линией печати этого блока?

Спасибо.

+0

Если ваш код на самом деле выглядел так, * как * примеры будут повышение SyntaxErrors на второй линии. Так как это, по-видимому, не так, вы должны внимательно изучить свой код, чтобы отредактировать свой пост, чтобы то, что вы разместили *, точно соответствует вашему действительному коду. Особенно, когда вы задаете синтаксические вопросы, внимание к деталям имеет первостепенное значение. Я ожидаю, что ваша фактическая проблема заключается в том, что вы смешиваете вкладки и пробелы, как предлагает Джон Кугельман в своем ответе. –

ответ

1

Вы проверили, что ваш отступ согласован? Вы используете 4 пространства везде (не вкладки)? Я вырезал и вставлял ваш код из вашего первого примера (начиная с входного файла безумия), и он отлично работал на моей машине.

+0

Я пробовал проверять с помощью поиска и замены, но, возможно, я не делаю это правильно. Любые советы о том, как это сделать или shal Я просто вручную заменю каждую введенную вкладку на 4 пробела? – Raz

+0

Зависит от того, что вы кодируете, используете ли вы VIM, Блокнот и т. Д. Я рекомендую [Aptana Studio 3] (http://www.aptana.com/products/studio3/download.html) (Aptana автоматически преобразует вкладки в 4 пробела). –

3

Я подозреваю, что вы смешиваете пространства и вкладки. Лучше всего использовать только пробелы, чтобы ваш визуальный отступ соответствовал логическому отступу.

Изучение исходного кода, есть символ табуляции во второй строке здесь:

if insanity == "1" or insanity == "2": 
\t print "Your body survives powered by a mind of jello. Good job!" 
     print "Now what will you do with the jello?" 

Я пометил его \t, что делает перепутаны отступы торчат.

+0

Нет, я не думаю, что я смешивал пространства и вкладки. Когда я отступил от линии печати под тем, о котором идет речь, - = и все под ним, я не получил сообщение об ошибке. Итак, возможно, существует правило в Python, что только одна строка функций ниже оператора if может быть обусловлена ​​результатом этого утверждения? Я думаю, что это должно быть какое-то правило, о котором я не знаю. – Raz

+0

OP имеет вложенные отпечатки внутри оператора печати –

+0

Вложенные отпечатки ?? – That1Guy

1

Вы не отступа после Elif в верхней части этого кода:

elif door == "2": 
print "You stare into the endless abyss at Cthulhu's retina." 
print "1. blueberries." 
print "2. Yellow jacket clothespins." 
print "3. Understanding revolvers yelling melodies." 

Вы пробовали:

elif door == "2": 
    print "You stare into the endless abyss at Cthulhu's retina." 
    print "1. blueberries." 
    print "2. Yellow jacket clothespins." 
    print "3. Understanding revolvers yelling melodies." 

и посмотреть, что происходит?

+0

Я сделал elif под кодом, как вы сказали - я просто не вставлял его точно в Stack Overflow. Я отредактирую его, чтобы исправить его сейчас. – Raz

+0

Хорошо, я отредактировал код, чтобы отразить то, что я сделал в первый раз. Сейчас это 100%. Вы увидите, что как только я добавлю еще один 4-пространственный отступ к строке «print» сразу после первой строки «print» после if-statement, я не получу ошибки. Мне интересно, почему это – Raz

1

по касательной:

Как вы уже выяснить, пытаясь сделать историю любого размера с каскадные, если-то в другом месте статьи очень быстро становится громоздким.

Вот быстрое внедрение государственной машины, что позволяет легко написать историю номер-по-комнате:

# assumes Python 3.x: 

def get_int(prompt, lo=None, hi=None): 
    """ 
    Prompt user to enter an integer and return the value. 

    If lo is specified, value must be >= lo 
    If hi is specified, value must be <= hi 
    """ 
    while True: 
     try: 
      val = int(input(prompt)) 
      if (lo is None or lo <= val) and (hi is None or val <= hi): 
       return val 
     except ValueError: 
      pass 

class State: 
    def __init__(self, name, description, choices=None, results=None): 
     self.name  = name 
     self.description = description 
     self.choices  = choices or tuple() 
     self.results  = results or tuple() 

    def run(self): 
     # print room description 
     print(self.description) 

     if self.choices: 
      # display options 
      for i,choice in enumerate(self.choices): 
       print("{}. {}".format(i+1, choice)) 
      # get user's response 
      i = get_int("> ", 1, len(self.choices)) - 1 
      # return the corresponding result 
      return self.results[i] # next state name 

class StateMachine: 
    def __init__(self): 
     self.states = {} 

    def add(self, *args): 
     state = State(*args) 
     self.states[state.name] = state 

    def run(self, entry_state_name): 
     name = entry_state_name 
     while name: 
      name = self.states[name].run() 

и ваша история переписана, чтобы использовать его

story = StateMachine() 

story.add(
    "doors", 
    "You are standing in a stuffy room with 3 doors.", 
    ("door 1", "door 2", "door 3" ), 
    ("wolves", "cthulhu", "treasury") 
) 

story.add(
    "cthulhu", 
    "You stare into the endless abyss at Cthulhu's retina.", 
    ("blueberries", "yellow jacket clothespins", "understanding revolvers yelling melodies"), 
    ("jello",  "jello",      "muck") 
) 

story.add(
    "muck", 
    "The insanity rots your eyes into a pool of muck. Good job!" 
) 

story.add(
    "jello", 
    "Your body survives, powered by a mind of jello. Good job!\nNow, what will you do with the jello?", 
    ("eat it", "load it into your gun", "nothing"), 
    ("no_brain", "no_brain",    "survive") 
) 

story.add(
    "no_brain", 
    "With no brain, your body shuts down; you stop breathing and are soon dead." 
) 

story.add(
    "survive", 
    "Smart move, droolio!" 
) 

if __name__ == "__main__": 
    story.run("doors") 

Для отладки, Я добавил метод, который использует StateMachinepydot для печати отформатированного графа состояний,

# belongs to class StateMachine 
    def _state_graph(self, png_name): 
     # requires pydot and Graphviz 
     from pydot import Dot, Edge, Node 
     from collections import defaultdict 

     # create graph 
     graph = Dot() 
     graph.set_node_defaults(
      fixedsize = "shape", 
      width  = 0.8, 
      height = 0.8, 
      shape  = "circle", 
      style  = "solid" 
     ) 

     # create nodes for known States 
     for name in sorted(self.states): 
      graph.add_node(Node(name)) 

     # add unique edges; 
     ins = defaultdict(int) 
     outs = defaultdict(int) 
     for name,state in self.states.items(): 
      # get unique transitions 
      for res_name in set(state.results): 
       # add each unique edge 
       graph.add_edge(Edge(name, res_name)) 
       # keep count of in and out edges 
       ins[res_name] += 1 
       outs[name] += 1 

     # adjust formatting on nodes having no in or out edges 
     for name in self.states: 
      node = graph.get_node(name)[0] 
      i = ins[name] 
      o = outs.get(name, 0) 
      if not (i or o): 
       # stranded node, no connections 
       node.set_shape("octagon") 
       node.set_color("crimson") 
      elif not i: 
       # starting node 
       node.set_shape("invtriangle") 
       node.set_color("forestgreen") 
      elif not o: 
       # ending node 
       node.set_shape("square") 
       node.set_color("goldenrod4") 

     # adjust formatting of undefined States 
     graph.get_node("node")[0].set_style("dashed") 
     for name in self.states: 
      graph.get_node(name)[0].set_style("solid") 

     graph.write_png(png_name) 

и назвав его как story._state_graph("test.png") результатов в

enter image description here

Я надеюсь, что вы нашли его интересным и полезным.

вещь, чтобы думать о следующем: инвентарные

  • номера: вещи, которые вы можете забрать

  • игрока инвентарь: вещи, которые вы можете использовать или падение

  • необязательный выбор: вы можете только разблокировать красную дверь, если у вас есть красный ключ в инвентаре

  • модифицируемые комнаты: если вы входите в секцию uded рощу и поджечь его, она должна быть обугленные Роща, когда вы вернетесь позже