Probleme affichage - Boucle for et condition

Fermé
isra - 26 avril 2018 à 20:03
 critou - 27 avril 2018 à 18:17
Bonsoir !
J'ai un petit soucis avec un bout de code python, j'essaye en fait à partir d'une matrice représentant un labyrinthe sous forme de bits (0 ou 1) de l'afficher sous une autre forme (avec d'autres caractères)
Le programme ne m'affiche que le caractère + .
Je me dis que c'est peut etre parceque j'ai initialisé le tableau laby à 0 pour toutes les cases, ce qui fausse les résultats?

Voici l'énoncé: https://www.lri.fr/~blsk/GOL/DM.html (QUESTION 1)
Et le code :
l = 5; h = 3;
laby = [[0] * (2*l+1) for _ in range(2*h+1)]
laby2 = [[''] * (2*l+1) for _ in range(2*h+1)]

def affiche (laby):
for i in range(len(laby)-1):
for j in range(len(laby[i])-1):
if (laby[i][j] == 0):
laby2[i][j] = ' '
print laby2[i][j]
elif ((i == 0) and (j == 0)):
laby2[i][j] = '+'
print laby2[i][j]
elif (((i % 2) == 1) and ((j % 2) == 1)):
laby2[i][j] = ' '
print laby2[i][j]
elif ((laby[i][j] == 1) and (laby[i+1][j] == 1) and (laby[i-1][j] == 1)):
laby2[i][j] = '|'
print laby2[i][j]
elif ((laby[i][j] == 1) and (laby[i][j+1] == 1) and (laby[i][j-1] == 1)):
laby2[i][j] = '--'
print laby2[i][j]
elif ((laby[i][j] == 1) and (laby[i][j+1] == 1) and (laby[i+1][j] == 1) and (laby[i+1][j+1] == 0)):
laby2[i][j] = '+'
print laby2[i][j]
elif ((laby[i][j] == 1) and (laby[i][j-1] == 1) and (laby[i-1][j] == 1) and (laby[i-1][j-1] == 0)):
laby2[i][j] = '+'
print laby2[i][j]
elif ((laby[i][j] == 1) and (laby[i][j+1] == 1) and (laby[i+1][j] == 1) and (laby[i+1][j+1] == 0)):
laby2[i][j] = '+'
print laby2[i][j]
elif ((laby[i][j] == 1) and (laby[i][j-1] == 1) and (laby[i-1][j] == 1) and (laby[i-1][j-1] == 0)):
laby2[i][j] = '+'
print laby2[i][j]
elif (((laby[i][j] == 0) and (laby[i][j+1] == 0)) or ((laby[i][j] == 0) and (laby[i][j+1] == 0))):
laby2[i][j] = ' '
print laby2[i][j]
break #return laby2?



affiche (laby2)





Voila voila.. Merci!
A voir également:

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 26 avril 2018 à 22:00
Bonjour,

Je ne connais pas bien les nuances de Python, mais j'aurais quelques remarques :

1 - Tu définis une variable laby et une variable laby2 en dehors de ta fonction. Je suppose qu'elles ont donc une portée globale. Mais tu donnes le nom "laby" au labyrinthe passé en argument de ta fonction. Que tu appelles avec l'argument laby2, qui sera donc à la fois le laby et le laby2 à l'intérieur de la fonction !! Franchement on ne comprend plus rien et on ne sait pas quel objet est lu, écrit, etc...
C'est une très mauvaise pratique.
Si ta fonction agit sur les objets globaux, elle n'a pas besoin de paramètre. Sinon, nomme-les différemment.

2 - Dans ta collection de elif, tu utilises allègrement des [i-1], [i+1] sans vérifier si ces indices sont bien définis dans le tableau.

3 - Ton premier test porte sur laby[i][j] == 0. Du coup, en admettant que les seuls valeurs possibles soient 0 et 1, dans tous les elif suivant laby[i][j] == 1 est VRAI. Tu peux donc simplifier et ne pas l'écrire. De même, le tout dernier test sera toujours FAUX.

Xavier
0
Merci pour ta réponse!
En fait la matrice laby est supposée etre la matrice lue (en bits), et laby 2 le résultat.. Je viens d'essayer de deplacer la ligne qui déclare laby 2 juste avant la boucle et ca m'a fait un msg d'erreur
0
Par contre j'ai pas compris ton petit 2)?
0
Je viens de changer tous les laby2 dans mon code par des laby, le programme m'affiche maintenant: --
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 27 avril 2018 à 14:18
Essaie avec ça :
l = 5; h = 3;
valeurs = [[0] * (2*l+1) for _ in range(2*h+1)]
dessins = [[''] * (2*l+1) for _ in range(2*h+1)]

def affiche ():
  for i in range(len(valeurs)-1):
    for j in range(len(valeurs[i])-1):
      if (valeurs[i][j] == 0):
        dessins[i][j] = ' '
        print dessins[i][j]
      elif ((i == 0) and (j == 0)):
        dessins[i][j] = '+'
        print dessins[i][j]
      elif (((i % 2) == 1) and ((j % 2) == 1)):
        dessins[i][j] = ' '
        print dessins[i][j]
      elif ((valeurs[i+1][j] == 1) and (valeurs[i-1][j] == 1)):
        dessins[i][j] = '|'
        print dessins[i][j]
      elif ((valeurs[i][j+1] == 1) and (valeurs[i][j-1] == 1)):
        dessins[i][j] = '--'
        print dessins[i][j]
      elif ((valeurs[i][j+1] == 1) and (valeurs[i+1][j] == 1) and (valeurs[i+1][j+1] == 0)):
        dessins[i][j] = '+'
        print dessins[i][j]
      elif ((valeurs[i][j-1] == 1) and (valeurs[i-1][j] == 1) and (valeurs[i-1][j-1] == 0)):
        dessins[i][j] = '+'
        print dessins[i][j]
      elif ((valeurs[i][j+1] == 1) and (valeurs[i+1][j] == 1) and (valeurs[i+1][j+1] == 0)):
        dessins[i][j] = '+'
        print dessins[i][j]
      elif ((valeurs[i][j-1] == 1) and (valeurs[i-1][j] == 1) and (valeurs[i-1][j-1] == 0)):
        dessins[i][j] = '+'
        print dessins[i][j]

affiche () 


Il faut aussi, comme je l'ai dit dans le point 2, faire attention aux i+1 et i-1. Ton tableau laby (valeurs dans le code que je donne) va de 0 à 4. Que se passe-t-il si tu demandes l'accès à laby[i-1] quand i vaut 0 ? laby[-1] n'est pas défini... Je ne connais pas Python mais dans la grande majorité des langages, cela causera une erreur. En général on vérifie que laby[i-1] existe, ou que i est supérieur à 0. Pareil pour laby[i+1] quand i vaut le maximum, 4. Et pareil avec j, entre 0 et 2...

Xavier
0
Bonjour.

Je me dis que c'est peut etre parceque j'ai initialisé le tableau laby à 0 pour toutes les cases, ce qui fausse les résultats?

Comment veux-tu générer un labyrinthe si toutes les pièces et cloisons sont à 0 ?
Cela n'a aucun sens !

Tu devrais donc partir de l'exemple fournit sur la page de ton exercice.

tableau = (
    '11111111111',
    '10001000001',
    '11101011101',
    '10100000101',
    '10111110111',
    '10000000001',
    '11111011111',
)


Evite tous ces prints dans ta fonction et utilise str.join sur ta liste en fin de ta fonction.

Pour décomposer le travail, je te conseille de séparer la création des tuiles et cloisons verticales (lignes impaires), et la création des passages et cloisons horizontales (lignes paires) en 2 boucles distinctes.
Et pour faire cela il faut se servir du 3ème paramètre de range qui définit le step.
0