Morpion : simplification des tests

Galatix -  
 PierrotLeFou -

Bonjour,

En codant en python pour faire un morpion à l'aide de la console. 

J'ai dû programmer une fonction qui doit savoir si trois éléments (ronds ou croix) sont alignés, j'ai donc coder 8 "if" différents. 

Les croix et ronds sont associés à une coordonné dans un dictionnaire (clé = coordonné, valeur="X" ou "O")

Voici ma fonction : 

def test_winner():
    global flag
        
    if dico["A1"] == dico["B1"] == dico["C1"] == flag:
            win()
            print("Joueur ",flag, "a gagné    ;) ")
            flag = "fin"
    
    if dico["A2"] == dico["B2"] == dico["C2"] == flag:
            win()
            print("Joueur ",flag, "a gagné    ;) ")
            flag = "fin"
        
    if dico["A3"] == dico["B3"] == dico["C3"] == flag:
            win()
            print("Joueur ",flag, "a gagné    ;) ")
            flag = "fin"
    
    if dico["A1"] == dico["A2"] == dico["A3"] == flag:
            win()
            print("Joueur ",flag, "a gagné    ;) ")
            flag = "fin"
        
    if dico["B1"] == dico["B2"] == dico["B3"] == flag:
            win()
            print("Joueur ",flag, "a gagné    ;) ")
            flag = "fin"
        
    if dico["C1"] == dico["C2"] == dico["C3"] == flag:
            win()
            print("Joueur ",flag, "a gagné    ;) ")
            flag = "fin"
        
    if dico["A1"] == dico["B2"] == dico["C3"] == flag:
            win()
            print("Joueur ",flag, "a gagné    ;) ")
            flag = "fin"
            
    if dico["C1"] == dico["B2"] == dico["A3"] == flag:
            win()
            print("Joueur ",flag, "a gagné    ;) ")
            flag = "fin"

"""

Je trouve que mon code se répète beaucoup et en informatique tout code qui se répète devrait pouvoir être factorisé...

J'ai remarqué que si les cases s'alignent , c'est soit A_,A_,A_ ou _1, _1, _1 ou encore _1,_2_3 ou A_,B_,C_ (pour les diagonales). 

Je me demande donc si vous verriez d'autres moyens de l'écrire à l'aide de cette information ?

Merci pour votre aide. 

2 réponses

  1. Utilisateur anonyme
     

    Bonjour

    pourquoi ne pas avoir utilisé une "grille", une liste de liste par exemple ?

    Tu pourrais faire des boucles, les coordonnées en X et en Y, avec les indices de ces listes


    1
  2. PierrotLeFou
     

    Ou quelque chose du genre?

        if any(all(grille[i][j] == "X" for j in range(3)) for i in range(3)):

    Tu permutes i et j dans grille[i][j] les indices pour l'autre dimension.
    Pour les diagonales:

        if all(grille[i][i] == "X" for i in range(3)):
        if all(grille[2-i][i] == "X" for i in range(3)):
    1