Aide puissance 4 simple verif colonne

Résolu
m4tts -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'essaye de faire un puissance 4 en python.

Je n'ai que les bases, donc je ne peux utiliser que des commandes simples et basiques. Même si cela rallonge le code, ce n'est pas grave.

Je suis rendu au vérification des colonnes et j'ai écrit un programme qui est censé fonctionner or ce n'est pas le cas. Je demande votre aide car je vois pas de solution.

Voici le programme en question:

def a_gagne_vert(grille, joueur):
    c = 0
    while c < len(grille) - 3:
        for i in range(0, len(grille[0]) - 1):
            if grille[c][i] == grille[c + 1][i] == grille[c + 2][i] == grille[c + 3][i] == joueur:
                return True
        c = c + 1
    return False

print(
    a_gagne_vert([
        [2, 1, 1, 1, 2, 2],
        [1, 1, 2, 2, 1, 2],
        [1, 1, 2, 0, 0, 2],
        [1, 1, 2, 2, 0, 2],
        [0, 0, 0, 0, 0, 0]
    ],
    2
))


Je devrais avoir d'afficher dans ma console
True
, or c'est
False
.

Merci

Configuration: Windows / Chrome 97.0.4692.71

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Merci d'utiliser les balises de codes dans tes prochains messages. Essaye aussi d'espacer ton code de sorte à te conformer aux recommandations PEP8 (espace derrière les virgules, espaces autour des opérateurs).

    Ton bug est dû au fait que ton programme n'examine pas la dernière colonne. En effet, si tu écris
    for i in range(n)
    , tu itères de
    0
    inclue à
    n
    exclu avec un pas de
    1
    , donc sur les valeurs
    0, 1 ..., n -1
    .

    De plus, vu que tu connais
    for
    et
    range
    , tu devrais l'utiliser à la place de ta boucle
    while
    , ce serait plus élégant. Généralement les indices sont notés
    i
    et
    j
    (
    i
    pour les lignes de la matrices,
    j
    pour les indices de la colonne). En tout cas, ce que tu appelles
    c
    n'est pas adéquat, car ce n'est pas un indice de colonne mais de ligne. Donc si tu veux utiliser
    i
    et
    c
    , on aboutirait au code suivant :

    def a_gagne_vertical(grille, joueur):
         for i in range(len(grille) - 3):
             for c in range(len(grille[0])):
                 if grille[i][c] == grille[i + 1][c] == grille[i + 2][c] == grille[i + 3][c] == joueur:
                     return True
         return False
    
    print(
        a_gagne_vertical([
            [2, 1, 1, 1, 2, 2],
            [1, 1, 2, 2, 1, 2],
            [1, 1, 2, 0, 0, 2],
            [1, 1, 2, 2, 0, 2],
            [0, 0, 0, 0, 0, 0]
        ],
        2
    ))


    Dernier point : Il faut être vigilant à ce que retourne un test d'égalité. En l'occurrence, python3 renvoie la valeur (et non
    True
    ou
    False
    ), ce qui signifie que lorsqu'un test d'égalité est évalue, on ne compare pas un booléen à une valeur de ta matrice. Donc c'est correct en python3, mais selon le langage, écrire un test ainsi peut ne pas marcher.

    Bonne chance
    1
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Pour remplacer
      while c < len(grille) - 3:

      par un for, je suggère plutôt:
      for c in range(len(grille)-3):

      et pas
      for c in range(len(grille)-2): 
      0
      1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Merci pour tes remarques yg_be, j'ai corrigé le message précédent en conséquence. Cette correction est importante car sinon, la boucle telle qu'elle était écrite pouvait sortir hors de la grille et faire planter le programme.
        0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    il y a une petite erreur en ligne 4: affiche peut-être les valeurs de i pour t'aider à comprendre.
    0