Morpion : simplification des tests
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
-
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
-
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)):