Morpion : simplification des tests

Fermé
Galatix - Modifié le 27 oct. 2022 à 12:37
 PierrotLeFou - 27 oct. 2022 à 05:22

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. 

A voir également:

2 réponses

Utilisateur anonyme
26 oct. 2022 à 20:03

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

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