Partage
  • Partager sur Facebook
  • Partager sur Twitter

Puissance 4, PROJET NSI

    23 mai 2022 à 10:45:34

    Bonjour, ce fait ce poste afin de demander de l'aide pour le code de mon projet suivant :

    from tkinter import *
    
    def quitter():
        menu.destroy()
        exit(0)
        
    def inserer(x):
        y = grille.inserer(x)
        print(y)
        if y != None :
            if grille.tour == 1 :
                couleur = "red"
                grille.tour = 2
                label_tour.configure(text="Tour de " + value2.get(), fg="yellow", bg="gray")
            else:
                couleur = "yellow"
                grille.tour = 1
                label_tour.configure(text="Tour de " + value1.get(), fg="red", bg="white")
            cX = (Largeur-rLargeur)//2 + s*(3*x+2)
            cY = (Hauteur-rHauteur)//2 + s*(3*(5-y)+2)
            Canevas.create_oval(cX-s, cY-s, cX+s, cY+s, fill=couleur)
            vainqueur = grille.test_alignement()
            if vainqueur !=0 :
                gagner(vainqueur)
            elif grille.est_pleine():
                egalite()
                
    def gagner(vainqueur):
        
        jeu.destroy()
        victoire = Tk()
        victoire.title("Puissance 4")
        if vainqueur == 1:
            Label(text = "Le joueur 1 du nom de {} a gagne".format(value1.get())).pack(padx=5, pady=5)
        elif vainqueur == 2:
            Label(text = "Le joueur 2 du nom de {} a gagne".format(value2.get())).pack(padx=5, pady=5)
        frame = Frame(victoire)
        frame.pack(side = BOTTOM)
        Button(frame, text="Rejouer", command=lambda:[victoire.destroy(), rejouer()]).pack(side=LEFT, padx=5, pady=5)
        Button(frame, text="Quitter", command=exit).pack(side=LEFT, padx=5, pady=5)
        victoire.mainloop()
        
    def egalite():
        jeu.destroy()
        victoire = Tk()
        victoire.title("Puissance 4")
        texte = Label(victoire, text = "Egalité !")
        texte.pack(padx=5, pady=5)
        frame = Frame(victoire)
        frame.pack(side = BOTTOM)
        Button(frame, text="Rejouer", command=lambda:[victoire.destroy(), rejouer()]).pack(side=LEFT, padx=5, pady=5)
        Button(frame, text="Quitter", command=exit).pack(side=LEFT, padx=5, pady=5)
        victoire.mainloop()
        
    def rejouer():
        global continuer
        continuer = True
        
    class Grille:
        def __init__(self):
            self.matrice = []
            for x in range(7):
                self.matrice.append([])
                for y in range(6):
                    self.matrice[x].append(0)
            self.tour = 1
            
        def inserer (self, colonne):
            assert type(colonne) == int
            assert 0 <= colonne <7
            
            for y in range (6):
                if self.matrice[colonne][y] == 0:
                    self.matrice[colonne][y] = self.tour
            return y
        def __str__(self):
            
            out = ""
            for y in range(5, -1, -1):
                out = out + "| "
                for x in range(7):
                    out = out + str(self.matrice[x][y]) + ""
                out = out + "|\n"
            return out
        
        def test_alignement(self):
            couleur_case = 0
            for y in range(6):
                for x in range(7):
                    couleur_case == self.matrice[x][y]
                    if couleur_case == 0:
                        continue
                    if y <= 2 :
                        if self.matrice[x][y+1] == couleur_case:
                            if self.matrice[x][y+2] == couleur_case:
                                if self.matrice[x][y+3] == couleur_case:
                                    return couleur_case
                    if x <= 3 :
                        if self.matrice[x+1][y] == couleur_case:
                            if self.matrice[x+2][y] == couleur_case:
                                if self.matrice[x+3][y] == couleur_case:
                                    return couleur_case
                    if x <= 3 and y <= 2:
                        if self.matrice[x+1][y+1] == couleur_case:
                            if self.matrice[x+2][y+2] == couleur_case:
                                if self.matrice[x+3][y+3] == couleur_case:
                                    return couleur_case
                    if x<= 3 and y >= 3 :
                        if self.matrice[x+1][y-1] == couleur_case:
                            if self.matrice[x+2][y-2] == couleur_case:
                                if self.matrice[x+3][y-3] == couleur_case:
                                    return couleur_case
            return 0
        
        def est_pleine (self):
            pleine = True
            for x in self.matrice:
                for y in x:
                    if y == 0:
                        pleine = False
                        break
            return pleine
        
    menu=Tk()
    menu.title("Puissance 4")
    
    continuer = True
    
    value1 = StringVar()
    value1.set("Nom du joueur 1")
    entree = Entry(menu, textvariable = value1, width=30)
    entree.pack(padx=5, pady=5)
    
    value2 = StringVar()
    value2.set("Nom du joueur 2")
    entree = Entry(menu, textvariable = value2, width=30)
    entree.pack(padx=5, pady=5)
    
    Button(menu, text ="Démarrer", command=menu.destroy).pack(side=RIGHT, padx=5, pady=5)
    
    Button(menu, text="Quitter", command=quitter).pack(side=LEFT, padx=5, pady=5)
    menu.mainloop()
    
    while(continuer):
        
        continuer = False
        
        grille = Grille()
        grille.tour = 1
        
        jeu = Tk()
        jeu.title("Puissance 4")
        
        Largeur = 990
        Hauteur = 540
        Canevas = Canvas(jeu, width=Largeur, height=Hauteur)
        
        s = (Hauteur-50)//19
        d = 2*s
        rLargeur = s*22
        rHauteur = s*19
        rX = Largeur // 2
        rY = Hauteur //2
        Canevas.create_rectangle(rX-rLargeur//2, rY-rHauteur//2, rX+rLargeur//2, rY+rHauteur//2, outline = "black", fill="blue")
        for i in range(7):
            for j in range(6):
                cX = (Largeur-rLargeur)//2 + s*(3*i+2)
                cY = (Hauteur-rHauteur)//2 + s*(3*j+2)
                Canevas.create_oval(cX-s, cY-s, cX+s, cY+s, fill="white")
                
        frame_tour = Frame(jeu, borderwidth=20, relief=GROOVE)
        frame_tour.pack(side=TOP, padx=60, pady=40)
        label_tour = Label(frame_tour, text="Tour de "+ value1.get(), bg="white", fg="red")
        label_tour.pack(padx=10, pady=10)
        
        frame = Frame(jeu)
        frame.pack(side=BOTTOM)
        
        Button(frame, text = str(0), font=("TkDefaultFont", 40), command=lambda:inserer(0)).pack(side=LEFT, padx=22, pady=22)
        Button(frame, text = str(1), font=("TkDefaultFont", 40), command=lambda:inserer(1)).pack(side=LEFT, padx=22, pady=22)
        Button(frame, text = str(2), font=("TkDefaultFont", 40), command=lambda:inserer(2)).pack(side=LEFT, padx=22, pady=22)
        Button(frame, text = str(3), font=("TkDefaultFont", 40), command=lambda:inserer(3)).pack(side=LEFT, padx=22, pady=22)
        Button(frame, text = str(4), font=("TkDefaultFont", 40), command=lambda:inserer(4)).pack(side=LEFT, padx=22, pady=22)
        Button(frame, text = str(5), font=("TkDefaultFont", 40), command=lambda:inserer(5)).pack(side=LEFT, padx=22, pady=22)
        Button(frame, text = str(6), font=("TkDefaultFont", 40), command=lambda:inserer(6)).pack(side=LEFT, padx=22, pady=22)
        
        Canevas.pack(padx=5, pady=5)
        
        jeu.mainloop()
    

    le but étant de faire un puissance 4 (sans robot tout manuel) avec tkinter

    j'ai un problème, la variable Y (ordonnée du tableau) ne prend que la valeur "5" qui est le haut du plateau.

    pouvez vous m'aider ? svp

    -
    Edité par Corentin_n 23 mai 2022 à 11:47:30

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      23 mai 2022 à 11:32:58

      Salut,

      Ligne 75, ton return y doit être dans ta condition :

      for y in range (6):
                  if self.matrice[colonne][y] == 0:
                      self.matrice[colonne][y] = self.tour
                      return y



      • Partager sur Facebook
      • Partager sur Twitter
        23 mai 2022 à 11:35:19

        Bonjour, Merci d'indiquer un titre de sujet en rapport avec votre problématique.

        Mauvais titre

        Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

        Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

        De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

        Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

        Pour modifier votre titre, éditez le premier message de votre sujet.

        (titre originel : Projet de NSI)

        Liens conseillés

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2022 à 11:50:00

          Merci, ça refonctionne, c'était un problème d'indentation au recopiage de mon collègue

          par contre maintenant, nouveau problème :

          la condition de victoire ne fonctionne plus (genre quand 4 pions sont alignés ça ne déclenche pas la victoire)

          • Partager sur Facebook
          • Partager sur Twitter
            25 mai 2022 à 10:44:40

            def test_alignement(self):
                    couleur_case = 1
                    couleur_case2 = 2
                    for y in range(6):
                        for x in range(7):
                            couleur_case == self.matrice[x][y]
                            if couleur_case == 0:
                                continue
                            if y <= 2 :
                                if self.matrice[x][y+1] == couleur_case:
                                    if self.matrice[x][y+2] == couleur_case:
                                        if self.matrice[x][y+3] == couleur_case:
                                            return couleur_case
                            if x <= 3 :
                                if self.matrice[x+1][y] == couleur_case:
                                    if self.matrice[x+2][y] == couleur_case:
                                        if self.matrice[x+3][y] == couleur_case:
                                            return couleur_case
                            if x <= 3 and y <= 2:
                                if self.matrice[x+1][y+1] == couleur_case:
                                    if self.matrice[x+2][y+2] == couleur_case:
                                        if self.matrice[x+3][y+3] == couleur_case:
                                            return couleur_case
                            if x<= 3 and y >= 3 :
                                if self.matrice[x+1][y-1] == couleur_case:
                                    if self.matrice[x+2][y-2] == couleur_case:
                                        if self.matrice[x+3][y-3] == couleur_case:
                                            return couleur_case
                    for y in range(6):
                        for x in range(7):
                            couleur_case2 == self.matrice[x][y]
                            if couleur_case2 == 0:
                                continue
                            if y <= 2 :
                                if self.matrice[x][y+1] == couleur_case2:
                                    if self.matrice[x][y+2] == couleur_case2:
                                        if self.matrice[x][y+3] == couleur_case2:
                                            return couleur_case2
                            if x <= 3 :
                                if self.matrice[x+1][y] == couleur_case2:
                                    if self.matrice[x+2][y] == couleur_case2:
                                        if self.matrice[x+3][y] == couleur_case2:
                                            return couleur_case2
                            if x <= 3 and y <= 2:
                                if self.matrice[x+1][y+1] == couleur_case2:
                                    if self.matrice[x+2][y+2] == couleur_case2:
                                        if self.matrice[x+3][y+3] == couleur_case2:
                                            return couleur_case2
                            if x<= 3 and y >= 3 :
                                if self.matrice[x+1][y-1] == couleur_case2:
                                    if self.matrice[x+2][y-2] == couleur_case2:
                                        if self.matrice[x+3][y-3] == couleur_case2:
                                            return couleur_case2
            un nouveau problème est là, lorsque 3 pions jaunes (variable couleur_case2 = 2) sont collés  ça gagne
            alors que dans le code pour couleur_case = 1 tout fonctionne
            edit : même couleur_case = 1 fonctionne pas dans le même cas

            -
            Edité par Corentin_n 25 mai 2022 à 11:04:46

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              25 mai 2022 à 17:06:38

              Salut !

              Pour savoir s'il y a 4 pions de même couleur alignés je te propose de comparer des chaines de caractères.

              fours = ("1, 1, 1, 1", "2, 2, 2, 2")
              area = [[0, 1, 2, 0, 0],\
              		[2, 1, 1, 1, 0],\
              		[2, 2, 1, 1, 0],\
              		[2, 1, 2, 1, 0],\
              		[2, 2, 2, 2, 0]]
              
              #####################LINES#####################
              for x, line in enumerate(area):
              	if fours[0] in str(line):
              		print(f"PLAYER 1 WIN - LINE {len(area) - x+1}")
              	elif fours[1] in str(line):
              		print(f"PLAYER 2 WIN - LINE {len(area) - x+1}")
              
              		
              #####################COLUMNS#####################
              columns = [[line[i] for line in area] for i in range(len(area[0]))]
              for x, column in enumerate(columns):
              	if fours[0] in str(column):
              		print(f"PLAYER 1 WIN - COLUMN {x+1}")
              	elif fours[1] in str(column):
              		print(f"PLAYER 2 WIN - COLUMN {x+1}")
              
              #####################DIAGS#####################
              diags = [[] for _ in range(len(area[0])+len(area)-1)]
              
              for x, line in enumerate(area[::-1]):
              	for y, element in enumerate(line):
              		diags[y+x].append(element)
              
              for x, diag in enumerate(diags):
              	if fours[0] in str(diag):
              		print(f"PLAYER 1 WIN - DIAG {x+1}")
              	elif fours[1] in str(diag):
              		print(f"PLAYER 2 WIN - DIAG {x+1}")



              -
              Edité par Anonyme 25 mai 2022 à 17:24:33

              • Partager sur Facebook
              • Partager sur Twitter

              Puissance 4, PROJET NSI

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown