1

L'objectif: transformer une grille ASCII vide dans une carte-morpion. Il faut regarder cela ce vide:erreur d'index dans une boucle `for` Python

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

L'erreur:

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 puisque les gens sont devenus fous dernière fois que je ne posté partie

Je ne comprends pas pourquoi il est mentionné tuples . Le seul que je vois est la fonction range (1, 10), et comme c'est une boucle for, il ne devrait pas y avoir d'erreur d'index. Tous les commentaires et critiques sont appréciés. Merci d'avance.

+2

'myformat' doit retourner un tuple 3-len pour nourrir' format', mais il ne retourne que chaîne. que voulez-vous que le format devine pour remplir les autres champs? peut-être essayer 'print (" {0} | {0} | {0} "' –

+1

Python, comme la plupart des langages de programmation, compte les index de "0", pas de "1" - votre dernier index dans "moves" est "8 ", pas" 9 " – jsbueno

+0

@ Jean-FrançoisFabre Vous avez raison, j'ai écrit' return' sur chaque variable quand je voulais mettre quelque chose comme 'a = '...', b = '. c = '....' return a, b, c.' Je vais le changer et voir s'il résout le problème. –

Répondre

0

Dans votre exemple avec la ligne = 1 monFormat() retournera une chaîne de 5 espaces blancs ..

essayons que

>>> 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, déjà expliqué que le format attend 3 valeurs .
Puisqu'il y a seulement 1 format de chaîne de valeur ne peut pas trouver les valeurs manquantes.
Vous devez dire au format ce qu'il doit placer où par providong indices.

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

Il y a trois problèmes avec votre code.

Le premier est que votre code d'appel attend d'obtenir trois valeurs, mais vous ne retourner une valeur de votre fonction.

Le deuxième problème est que dans la fonction vous indexez moves avec les valeurs qui viennent de range(1, 10) dans le code appelant. Puisque l'argument stop à range est exclu, la plus grande valeur est 9. C'est hors limites dans moves (qui a neuf valeurs). Python indexe à partir de zéro, donc vous voulez probablement range(0, 9) ou simplement range(9) (ou vous devez soustraire un de la valeur avant de prendre chaque index).

La troisième question est que vous semblez être en utilisant line à deux fins différentes dans votre fonction. Vous l'utilisez pour indexer le tableau de carrés sur le tableau (via la liste moves). Et vous l'utilisez également pour numéroter les lignes horizontales du texte dans votre sortie. Ce ne sont pas la même chose, et vous obtiendrez des résultats bizarres si vous continuez à les utiliser de façon interchangeable.

Je ne suis pas sûr de ce que la meilleure façon de calculer les valeurs que vous voulez est. Si vous vous en tenez à itérer sur les lignes de la sortie et que vous voulez que votre fonction retourne trois valeurs (pour les trois places Les croix de ligne), vous aurez besoin de passer une valeur line de range(9) puis index avec line // 3 plus une valeur de range(3) (qui vous dirigera vers les trois carrés différents).