Problème condition python objet

Résolu/Fermé
Vicoumich Messages postés 31 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020 - Modifié le 8 mai 2020 à 00:44
Vicoumich Messages postés 31 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020 - 9 mai 2020 à 01:04
Bonjour,


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()

5 réponses

Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
8 mai 2020 à 00:47
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. :-)
1
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
8 mai 2020 à 14:52
Bonjour,

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.
1
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
9 mai 2020 à 01:03
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. :-)
1
Vicoumich Messages postés 31 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020
9 mai 2020 à 01:04
Oui tout fonctionne bien après modification merci beaucoup
0
Vicoumich Messages postés 31 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020
Modifié le 8 mai 2020 à 00:54
#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()
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vicoumich Messages postés 31 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020
8 mai 2020 à 22:36
merci beaucoup, voila la nouvelle ligne:

if (0 in self.x_croix and 1 in self.x_croix 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):
0