Problème condition python objet

Résolu
Vicoumich Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
Vicoumich Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
     
    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
  2. Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
     
    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
  3. Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
     
    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
    1. Vicoumich Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
       
      Oui tout fonctionne bien après modification merci beaucoup
      0
  4. Vicoumich Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
     
    #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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Vicoumich Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
     
    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