Problème condition python objet
Résolu
Vicoumich
Messages postés
31
Date d'inscription
Statut
Membre
Dernière intervention
-
Vicoumich Messages postés 31 Date d'inscription Statut Membre Dernière intervention -
Vicoumich Messages postés 31 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je suis débutant sur python, et j'ai commencé a créer un jeu de morpion sans interface graphique ( pour l'instant), juste la partie logique du jeu, or lorsque j'ai voulu testé une fonction de mon objet morpion, qui a pour but de détecter si il y a un alignement de croix en diagonal ( de la case d'index [0,0] à la case [2,2]. Or, alors que je lance le programme, la fonction ne me retourne rien( None) alors qu'elle devrait me retourner 1. je vous met si dessous mon programme ( il est possible qu'il y ai quelques choses inutiles pouvant être mal optimisées mais la n'est pas le problème). La condition non vérifiée qui devrait l'être est la troisième condition de la fonction _verife_ , et je l'appelle dans la fonction play ( qui n'appartient pas à l'objet).
merci d'avance pour vos réponses
Configuration: Windows / Chrome 81.0.4044.138
je suis débutant sur python, et j'ai commencé a créer un jeu de morpion sans interface graphique ( pour l'instant), juste la partie logique du jeu, or lorsque j'ai voulu testé une fonction de mon objet morpion, qui a pour but de détecter si il y a un alignement de croix en diagonal ( de la case d'index [0,0] à la case [2,2]. Or, alors que je lance le programme, la fonction ne me retourne rien( None) alors qu'elle devrait me retourner 1. je vous met si dessous mon programme ( il est possible qu'il y ai quelques choses inutiles pouvant être mal optimisées mais la n'est pas le problème). La condition non vérifiée qui devrait l'être est la troisième condition de la fonction _verife_ , et je l'appelle dans la fonction play ( qui n'appartient pas à l'objet).
merci d'avance pour vos réponses
#fonction de tri les listes x/y_croix et x/y_ronds def tri_insertion(tab): for i in range(1, len(tab)): k = tab[i] j = i-1 while j >= 0 and k < tab[j] : tab[j + 1] = tab[j] j -= 1 tab[j + 1] = k return tab #fonction de tri des tuples dans les listes croix et ronds contenant les coordonnées de chaques formes def tri_insertion_tuple(tab): for i in range(1, len(tab)): k = tab[i][0] kk = tab[i] j = i-1 while j >= 0 and k < tab[j][0] : tab[j + 1] = tab[j] j -= 1 tab[j + 1] = kk return tab class morpion(): def __init__(self,longueur,largeur ): self.longueur = longueur self.largeur = largeur self.case = longueur * largeur self.case_ocup = [] self.croix = [] self.ronds = [] self.x_croix = [] self.y_croix =[] self.x_ronds = [] self.y_ronds = [] def placer_croix ( self, x , y ): x = int( x ) y = int( y ) pos = ( x , y ) if pos in self.case_ocup : return False else : self.case_ocup.append( pos ) self.croix.append( pos ) def placer_rond (self,x,y): x = int( x ) y = int( y ) pos = ( x , y ) if pos in self.case_ocup : return False else : self.case_ocup.append( pos ) self.ronds.append( pos ) #Une fonction pour remettre le jeu a zéro et recommencer un partie def reset (self): self.case_ocup = [] self.croix = [] self.ronds = [] self.x_croix = [] self.y_croix = [] self.x_ronds = [] self.y_ronds = [] #On vérifie si il y a un allignement de 3 croix ou de 3 ronds def _verife_(self): if len(self.croix) >= 3 or len(self.ronds) >= 3: self.x_croix = [x[0] for x in self.croix] self.y_croix =[x[1] for x in self.croix] self.x_ronds = [x[0] for x in self.ronds] self.y_ronds = [x[1] for x in self.ronds] self.x_croix = tri_insertion(self.x_croix) self.y_croix = tri_insertion(self.y_croix) self.croix = tri_insertion_tuple(self.croix) self.x_ronds = tri_insertion(self.x_ronds) self.y_ronds = tri_insertion(self.y_ronds) self.ronds = tri_insertion_tuple(self.ronds) if 0 and 1 and 2 in self.x_croix and (self.y_croix.count(0)==3 or self.y_croix.count(1)==3 or self.y_croix.count(2)==3): return 1 elif 0 and 1 and 2 in self.y_croix and (self.y_croix.count(0)==3 or self.y_croix.count(1)==3 or self.y_croix.count(2)==3): return 1 elif 0 and 1 and 2 in self.x_croix and self.croix[0][0] == self.croix[0][1] and self.croix[1][0] == self.croix[1][1] and self.croix[2][0] == self.croix[2][1]: return 1 if 0 and 1 and 2 in self.x_ronds and (self.y_ronds.count(0)==3 or self.y_ronds.count(1)==3 or self.y_ronds.count(2)==3): return 1 elif 0 and 1 and 2 in self.y_ronds and (self.y_ronds.count(0)==3 or self.y_ronds.count(1)==3 or self.y_ronds.count(2)==3): return 1 elif 0 and 1 and 2 in self.x_ronds and self.ronds[0][0] == self.ronds[0][1] and self.ronds[1][0] == self.ronds[1][1] and self.ronds[2][0] == self.ronds[2][1]: return 1 def pos_croix(self): return self.croix def play (): jeu = morpion(3,3) jeu.placer_croix(0,0) jeu.placer_croix(1,1) jeu.placer_croix(2,2) print(jeu.pos_croix()) print(jeu._verife_()) play()
A voir également:
- Problème condition python objet
- Excel cellule couleur si condition texte - Guide
- Citizen code python avis - Accueil - Outils
- Vente objet occasion entre particulier - Guide
- Objet interdit en cabine ryanair - Guide
- Identifier un objet à partir d'une photo - Guide
5 réponses
Bonsoir Vicoumich,
il est difficile de t'apporter de l'aide sans l’indentation, bien que je ne doute pas que ce soit le cas dans ton code chez toi.
Pour conserver l'indentation sur le site il faut utiliser les balises de code python avant ou après avoir copié ton code. Tu peux te référer à ce petit tuto : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Un code non indenté, d'autant plus quand il est long, ça a tendance à décourager les personnes qui veulent aider. :-)
il est difficile de t'apporter de l'aide sans l’indentation, bien que je ne doute pas que ce soit le cas dans ton code chez toi.
Pour conserver l'indentation sur le site il faut utiliser les balises de code python avant ou après avoir copié ton code. Tu peux te référer à ce petit tuto : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Un code non indenté, d'autant plus quand il est long, ça a tendance à décourager les personnes qui veulent aider. :-)
Bonjour,
Le problème se trouve ici :
Tu ne peux pas l'écrire comme on dirait en français : "0, 1 et 2 sont tous dans la liste
En effet, dans un contexte avec des opérateurs booléens tel que
Quand tu écris :
cela revient au même qu' écrire :
car 0 devient
Ta condition est donc
Le problème se trouve ici :
0 and 1 and 2 in self.x_croix
Tu ne peux pas l'écrire comme on dirait en français : "0, 1 et 2 sont tous dans la liste
self.x_croix"
En effet, dans un contexte avec des opérateurs booléens tel que
and, les nombres, s'ils sont une condition à eux-seuls, sont convertis en booléens.
Quand tu écris :
0 and 1 and 2 in self.x_croix
cela revient au même qu' écrire :
False and True and (2 in self.x_croix)
car 0 devient
False, tandis que tout autre nombre non nul devient
True.
Ta condition est donc
False. Voilà pour l'explication. Je te laisse corriger.
C'est effectivement mieux ainsi, et il faut penser à le faire pour toutes tes conditions qui avaient le même problème.
Tu as testé à nouveau ?
Si cela répond à ta demande initiale, je te propose de marquer le sujet comme Résolu. :-)
Tu as testé à nouveau ?
Si cela répond à ta demande initiale, je te propose de marquer le sujet comme Résolu. :-)
#fonction de tri les listes x/y_croix et x/y_ronds def tri_insertion(tab): for i in range(1, len(tab)): k = tab[i] j = i-1 while j >= 0 and k < tab[j] : tab[j + 1] = tab[j] j -= 1 tab[j + 1] = k return tab #fonction de tri des tuples dans les listes croix et ronds contenant les coordonnées de chaques formes def tri_insertion_tuple(tab): for i in range(1, len(tab)): k = tab[i][0] kk = tab[i] j = i-1 while j >= 0 and k < tab[j][0] : tab[j + 1] = tab[j] j -= 1 tab[j + 1] = kk return tab class morpion(): def __init__(self,longueur,largeur ): self.longueur = longueur self.largeur = largeur self.case = longueur * largeur self.case_ocup = [] self.croix = [] self.ronds = [] self.x_croix = [] self.y_croix =[] self.x_ronds = [] self.y_ronds = [] def placer_croix ( self, x , y ): x = int( x ) y = int( y ) pos = ( x , y ) if pos in self.case_ocup : return False else : self.case_ocup.append( pos ) self.croix.append( pos ) def placer_rond (self,x,y): x = int( x ) y = int( y ) pos = ( x , y ) if pos in self.case_ocup : return False else : self.case_ocup.append( pos ) self.ronds.append( pos ) #Une fonction pour remettre le jeu a zéro et recommencer un partie def reset (self): self.case_ocup = [] self.croix = [] self.ronds = [] self.x_croix = [] self.y_croix = [] self.x_ronds = [] self.y_ronds = [] #On vérifie si il y a un allignement de 3 croix ou de 3 ronds def _verife_(self): if len(self.croix) >= 3 or len(self.ronds) >= 3: self.x_croix = [x[0] for x in self.croix] self.y_croix =[x[1] for x in self.croix] self.x_ronds = [x[0] for x in self.ronds] self.y_ronds = [x[1] for x in self.ronds] self.x_croix = tri_insertion(self.x_croix) self.y_croix = tri_insertion(self.y_croix) self.croix = tri_insertion_tuple(self.croix) self.x_ronds = tri_insertion(self.x_ronds) self.y_ronds = tri_insertion(self.y_ronds) self.ronds = tri_insertion_tuple(self.ronds) if 0 and 1 and 2 in self.x_croix and (self.y_croix.count(0)==3 or self.y_croix.count(1)==3 or self.y_croix.count(2)==3): return 1 elif 0 and 1 and 2 in self.y_croix and (self.y_croix.count(0)==3 or self.y_croix.count(1)==3 or self.y_croix.count(2)==3): return 1 elif 0 and 1 and 2 in self.x_croix and self.croix[0][0] == self.croix[0][1] and self.croix[1][0] == self.croix[1][1] and self.croix[2][0] == self.croix[2][1]: return 1 if 0 and 1 and 2 in self.x_ronds and (self.y_ronds.count(0)==3 or self.y_ronds.count(1)==3 or self.y_ronds.count(2)==3): return 1 elif 0 and 1 and 2 in self.y_ronds and (self.y_ronds.count(0)==3 or self.y_ronds.count(1)==3 or self.y_ronds.count(2)==3): return 1 elif 0 and 1 and 2 in self.x_ronds and self.ronds[0][0] == self.ronds[0][1] and self.ronds[1][0] == self.ronds[1][1] and self.ronds[2][0] == self.ronds[2][1]: return 1 def pos_croix(self): return self.croix def play (): jeu = morpion(3,3) jeu.placer_croix(0,0) jeu.placer_croix(1,1) jeu.placer_croix(2,2) print(jeu.pos_croix()) print(jeu._verife_()) play()
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question