1

Das Ziel: Verwandle ein leeres ASCII Gitter in ein Tic-Tac-Toe Board. Es sollte diese aussehen, wenn sie leer:Indexfehler in einer Python `for` Schleife erhalten

 |  |  
     |  |  
    ____|________|____ 
     |  |  
     |  |  
    ____|________|____ 
     |  |  
     |  |  
     |  | 

Der Fehler:

def myformat(moves, line): 
# there's got to be a better way to do this 
    if line in [1, 4, 7]: 
     if moves[line] == 'x': 
      return "\ /" 
     elif moves[line] == 'o': 
      return " oo " 
     elif moves[line] == 'none': 
      return " " 
    elif line in [2, 5, 8]: 
     if moves[line] == x: 
      return " xx " 
     elif moves[line] == o: 
      return "o o" 
     elif moves[line] == "none": 
      return " " 
    elif line in [3, 6]: 
     if moves[line] == x: 
      return "/__\b" 
     elif moves[line] == o: 
      return "o__o" 
     elif moves[line] == "none": 
      return "____" 
    elif line == 9: 
     if moves[line] == x: 
      return "/__\b" 
     elif moves[line] == o: 
      return "o__o" 
     elif moves[line] == "none": 
      return " "   
    else: 
     print("Fatal error.") 
>>> moves = ['none']*9 
>>> moves 
['none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none'] 
>>> for line in range(1, 10): 
    print("{}|{}|{}".format((myformat(moves, line)))) 

Traceback (most recent call last): 
    File "<pyshell#24>", line 2, in <module> 
    print("{}|{}|{}".format((myformat(moves, line)))) 
IndexError: tuple index out of range 

full code da die Menschen verrückt letzte Mal habe ich geschrieben nur ein Teil

Ich verstehe nicht, warum es Tupel Erwähnens . Die einzige, die ich sehe, ist die Range (1, 10) -Funktion, und da es eine for-Schleife ist, sollte es keinen Indexfehler geben. Alle Kommentare und Kritik werden geschätzt. Danke im Voraus.

+2

'myformat' sollte ein 3-läniges Tupel zurückgeben, um' format' zu liefern, aber es gibt nur eine Zeichenkette zurück. Was erwarten Sie von Format, um die anderen Felder zu füllen? Versuchen Sie 'print (" {0} | {0} | {0} "' –

+1

Python, wie die meisten Programmiersprachen, zählt Indizes von "0", nicht von "1" - Ihr letzter Index in "Moves" ist "8 ", nicht" 9 ". – jsbueno

+0

@ Jean-FrançoisFabre Du hast recht. Ich habe' Return' für jede Variable geschrieben, wenn ich etwas wie 'a =' ... ', b ='... ' c = '...' a, b, c zurückgeben. Ich werde es ändern und sehen, ob es das Problem behebt. –

Antwort

0

In Ihrem Beispiel mit der Linie = 1 myformat() würde eine Reihe von 5 Leerzeichen zurückgeben ..

versuchen lassen, dass

>>> ret_val = '  ' 
>>> '{} | {} | {}'.format(ret_val) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: tuple index out of range 

@ Jean-François Fabre, erklärten bereits, dass Format 3 Werte erwartet .
Da es nur ein Wertstringformat gibt, können die fehlenden Werte nicht gefunden werden.
Sie müssen angeben, was es wo durch Providong-Indizes platzieren soll.

>>> ret_val = '  ' 
>>> '{0} | {0} | {0}'.format(ret_val) 
'  |  |  ' 
0

Es gibt drei Probleme mit Ihrem Code.

Das erste ist, dass Ihr Aufrufcode erwartet, drei Werte zu erhalten, aber Sie geben nur einen Wert von Ihrer Funktion zurück.

Das zweite Problem ist, dass Sie innerhalb der Funktion moves mit Werten indexieren, die von range(1, 10) im aufrufenden Code kommen. Da das stop Argument zu range ausgeschlossen ist, ist der größte Wert 9. Das ist in moves (die neun Werte hat) außerhalb der Grenzen. Python-Indizes von Null, so dass Sie wahrscheinlich range(0, 9) oder nur range(9) wollen (oder Sie müssen einen von dem Wert subtrahieren, bevor Sie jeden Index nehmen).

Das dritte Problem ist, dass Sie scheinen, line für zwei verschiedene Zwecke in Ihrer Funktion zu verwenden. Sie verwenden es, um das Array von Quadraten auf der Platine zu indizieren (über die moves Liste). Und Sie verwenden es auch, um die horizontalen Textzeilen in Ihrer Ausgabe zu nummerieren. Das sind nicht die gleichen Dinge, und so werden Sie seltsame Ergebnisse bekommen, wenn Sie sie abwechselnd verwenden.

Ich bin nicht genau sicher, was der beste Weg ist, die Werte zu berechnen, die Sie wollen. Wenn Sie bei der Iteration über die Zeilen der Ausgabe bleiben und Ihre Funktion drei Werte zurückgeben soll (für die drei Quadrate, die die Zeile kreuzt), müssen Sie einen line Wert von range(9) übergeben und dann mit line // 3 plus einem Wert von range(3) (was Sie zu den drei verschiedenen Quadraten führt).