Communauté non-officielle autour du langage Python


    Puissance 4

    Partagez

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Puissance 4

    Message par Waldner le Mer 27 Fév - 15:03


    Bonjour à tous,

    Je me suis remis à python il y à quelques temps et j'ai pour projet de programmer un jeu de puissance 4 grâce au module Tkinter (c'est des graphisme de base mais ça fait largement l'affaire)
    Le but du jeu étant d'aligner 4 jetons de la même couleur en ligne, colonne ou en diagonale.
    Il y a 2 joueurs et c'est chacun son tour.

    Le programme contient:
    - une classe pour créer la fenêtre principale faisant appelle à toutes les fonctions pour construire le jeu
    - une fonction pour créer un tableau de 7 colonnes et 6 lignes où chaque case est un cercle
    - une fonction pour déterminer c'est à qui de jouer, donc changer la couleur du jeton (rouge pour le joueur 1 et jaune pour le jouer 2)
    - et une fonction qui vérifie si la partie est gagnée pour un joueur.

    C'est sur la dernière fonction (celle qui vérifie qui a gagné) que j'aurai besoin de votre aide Laughing
    Je ne vois pas trop comment faire No , faut il que je trouve toutes les possibilités dans une liste?
    ou est il possible de créer une fonction qui trouve toute seul quand 4 jetons de la même couleur sont alignés?

    Merci de vos réponses et désolé pour les éventuelles fautes d'orthographe Very Happy
    avatar
    Jule04
    Pyministrateur

    Messages : 98
    Date d'inscription : 15/01/2013
    Age : 21
    Localisation : Orléans

    Re: Puissance 4

    Message par Jule04 le Mer 27 Fév - 17:49

    Ce que tu peux essayer de faire, c’est dire au programme, dans cet ordre :

    • Si deux jetons de la même famille sont alignés,
    • On cherche si il y en a pas d'autres aux extrémités puis ainsi de suite.


    Un peu à la façon d'un démineur si on veut.

    EDIT : Je ne sais pas si c’est possible après, mais vérifier toute les lignes une par une verticalement et horizontalement dans le tableau, ça doit bien être faisable et beaucoup plus facile Smile

    RE-EDIT : Je n'affirme rien, je propose juste car je me pose la question du coup. J'essai ça de mon côté, essayé de trouver quelque chose de simple et efficace Smile



    _____________________________________________

    .Merci de respecter les quelques règles de comportement du forum.
    .Nous ne fournissons pas de support par messagerie privée.
    .Administrateur/Fondateur.
    http://areaonlan.eu

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Re: Puissance 4

    Message par Waldner le Mer 27 Fév - 19:45


    Merci de ta réponse , mais comme tu le dis verifier toutes les lignes et les colonnes peut se faire facilement grâce à des listes mais pour les diagonales je ne pense pas que cela soit possible.
    Et mon hypothèse de trouver toutes les solutions possibles, et regarder à chaque coup jouer si une d'entre elle a été jouée semble très longue et complexe...

    Je vais continuer de chercher...
    Sinon j'avais une autre question pendant la réalisation du code je me suis rendu compte qu'il était assez long, est-ce que tu voudrais bien jeter un coup d’œil pour voir si il y a moyen de le condenser?
    avatar
    Jule04
    Pyministrateur

    Messages : 98
    Date d'inscription : 15/01/2013
    Age : 21
    Localisation : Orléans

    Re: Puissance 4

    Message par Jule04 le Mer 27 Fév - 21:35

    Oui pas de soucis ! Post le ici.
    Si vraiment on ne trouve rien, rend toi sur le site du zéro. C’est beaucoup plus long à la réponse. Mais il y a de bon gars Smile


    _____________________________________________

    .Merci de respecter les quelques règles de comportement du forum.
    .Nous ne fournissons pas de support par messagerie privée.
    .Administrateur/Fondateur.
    http://areaonlan.eu

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Re: Puissance 4

    Message par Waldner le Jeu 28 Fév - 11:09

    voila le code du jeu.
    J'imagine qu'il est loin d'être parfait est qu'il nécessite des améliorations , et comme je l'ai dit plus haut il manque une fonction pour vérifier si la partie est gagnée =)
    donc n'hésitez pas à le critiquer.
    Merci =)

    Code:

    #------------------------------------
    from tkinter import *
    #----------------------------------
    def cercle(can, x, y, r , couleur):
        """creation d'un cercle en (x, y) de rayon r"""
        can.create_oval(x+r, y+r, x-r, y-r, fill = couleur)


    class Application(Tk):
        def __init__(self):
            ##creation de la fenetre principale avec un canvas et des bouttons
            Tk.__init__(self)##classe parente
            self.can =Canvas(self, width=740, height =680, bg = 'blue')
            self.can.grid(row =5,rowspan= 3, column= 1,columnspan= 7, padx = 5 , pady =5)#columnspan = étalement du canvas sur 7 lignes
            #---------------------------------------------------------
            Button(self, text ="GO", command=self.grille).grid(row = 1, column =1)
            Button(self, text= "quitter", command= self.destroy).grid(row= 1,column= 8)
            #-----creation des bouttons appellant la fonction jouer-------#
            Button(self, text= "colonne1", command = self.jouer1).grid(row = 2, column= 1)
            Button(self, text= "colonne2", command = self.jouer2).grid(row = 2, column =2)
            Button(self, text="colonne3", command= self.jouer3).grid(row = 2, column=3)
            Button(self,text= "colonne4", command= self.jouer4).grid(row = 2, column=4)
            Button(self,text= "colonne5", command= self.jouer5).grid(row = 2, column=5)
            Button(self,text="colonne6", command= self.jouer6).grid(row = 2, column = 6)
            Button(self,text="colonne7", command= self.jouer7).grid(row =2, column = 7)
            #----------------------------------------------------------------------
            self.liste1, self.liste2, self.liste3, self.liste4, self.liste5, self.liste6, self.liste7 = [], [], [], [],[], [],[]#listes des ordonnes des cercles
            self.x = [] #liste des abscisses
            self.nbrcoup,self.q1, self.q2, self.q3, self.q4,self.q5, self.q6, self.q7 =[], 5,5 ,5 ,5 ,5, 5, 5##compteurs de la fct jouer
           
        def grille(self):#creation des 7colonnes en "stockant" les coordonnnes des cercles dans les listes
            self.colonne1 = Tableau(self.can, 80, 80 , 45 ,'white', self.liste1, self.x)
            self.colonne2 = Tableau(self.can, 180, 80, 45, 'white', self.liste2, self.x)
            self.colonne3 = Tableau(self.can, 280, 80, 45, 'white', self.liste3, self.x)
            self.colonne4 = Tableau(self.can, 380, 80 ,45 ,'white', self.liste4, self.x)
            self.colonne5= Tableau(self.can, 480, 80 , 45 ,'white', self.liste5, self.x)
            self.colonne6 = Tableau(self.can, 580 , 80 , 45 ,'white' ,self.liste6, self.x)
            self.colonne7 = Tableau(self.can, 680 , 80 ,45 , 'white', self.liste7, self.x)

        def col1(self, LISTEA, z, qx):          ##la fonction determine la couleur du jeton en regardant si le nombre de jeton joué est paire ou impaire
            if len(self.nbrcoup) % 2 == 0:
                self.colonne1.coul1(self.x, LISTEA, z ,qx )
            else:
                self.colonne1.coul2(self.x, LISTEA, z, qx)

        def jouer1(self):                                  ##les fonctions jouer appelle la fonction col1 pour remplacer un  cercle blanc
            if len(self.nbrcoup)< 42:                      ##par un cercle de la couleur du joueur 1 ou 2
                self.col1(self.liste1, 0, self.q1)          ##nbrcoup est le compteur de boucle
                self.q1 = self.q1-1
                self.nbrcoup.append("a")
            else:
                return
        def jouer2(self):
            if len(self.nbrcoup)< 42:
                self.col1(self.liste2, 1, self.q2)
                self.q2 = self.q2-1
                self.nbrcoup.append("a")
            else:
                return
        def jouer3(self):
            if len(self.nbrcoup)< 42:
                self.col1(self.liste3, 2, self.q3)
                self.q3 = self.q3-1
                self.nbrcoup.append("a")
            else:
                return
        def jouer4(self):
            if len(self.nbrcoup)< 42:
                self.col1(self.liste4, 3, self.q4)
                self.q4 = self.q4-1
                self.nbrcoup.append("a")
            else:
                return
        def jouer5(self):
            if len(self.nbrcoup)< 42:
                self.col1(self.liste5, 4, self.q5)
                self.q5 = self.q5-1
                self.nbrcoup.append("a")
            else:
                return
        def jouer6(self):
            if len(self.nbrcoup)< 42:
                self.col1(self.liste6, 5, self.q6)
                self.q6 = self.q6-1
                self.nbrcoup.append("a")
            else:
                return
        def jouer7(self):
            if len(self.nbrcoup)< 42:
                self.col1(self.liste7, 6, self.q7)
                self.q7 = self.q7-1
                self.nbrcoup.append("a")
            else:
                return
               
                   


    class Tableau(object):         
        def __init__(self, canev, x, y, r, couleur, LISTE, LISTx):
            """creation d'une colonne de cercle"""
            self.canev, self.x, self.y, self.r, self.couleur= canev, x, y,r ,couleur
            while y < 600:
                cercle(canev, x , y, r, couleur)
                LISTE.append(y)    #on ajoute l'ordonnée du cercle dans une liste
                y = y+ 100
            LISTx.append(x)        #ajout de l'abscisse dans une liste
                   
        def coul1(self, LISTEx, LISTE,q ,s ):
            cercle(self.canev, LISTEx[q], LISTE[s], 45 , 'red')#creation d'un cercle rouge
        def coul2(self, LISTEx, LISTE,q,s):
            cercle(self.canev, LISTEx[q], LISTE[s], 45, 'yellow')#creation d'un cercle jaune
       


    p = Application()
    p.mainloop()
    avatar
    Valou
    Bogoss du Blitzcrank

    Messages : 29
    Date d'inscription : 30/01/2013
    Age : 22
    Localisation : France

    Re: Puissance 4

    Message par Valou le Jeu 28 Fév - 20:43

    J'ai testé ton script. Chez moi, ça fonctionne très bien. La seule remarque que je peux te faire est que ton script ne gère pas encore la fin de partie (dès que 4 pions sont alignés, print win et pause). Pour l'instant je vois pas d'autre chose mais c'est plutôt pas mal !
    avatar
    Jule04
    Pyministrateur

    Messages : 98
    Date d'inscription : 15/01/2013
    Age : 21
    Localisation : Orléans

    Re: Puissance 4

    Message par Jule04 le Jeu 28 Fév - 21:17

    Ouah ! J'aime beaucoup, j'aurai pas fait mieux niveau graphique (sauf niveau placement).
    Pour la fonction de vérification je cherche encore mais je ne vois pas comment faire enfaite. C'est embêtant car j'ai essayé la méthode comme j'avais dit plus haut et ça m'a rendu un truc vraiment pas normal. (Ça gagnait n'importe quand pour être franc).

    Par contre, pour ton "Go!" et "Quitter". Tu as les menus horizontaux du style "Fichier, Edition" de Windows.

    Tu dis où va être ton menu :
    Code:
    menubar = Menu(nom_de_ta_fenetre)
    Tu dit que "filemenu" est un menu présent dans "menubar":
    Code:
    filemenu = Menu(menubar)
    Puis tu y ajoutes des boutons :
    Code:
    filemenu.add_command(label="Jouer", command=appel_dune_fonction)
    #Label = nom du bouton | command = le nom de la fonction à appeler
    Tu y ajoutes les catégories de menus:
    Code:
    menubar.add_cascade(label="Menu", menu=filemenu)
    #Label = nom de la catégorie de menu | menu = les boutons qui devront être présent dedans.
    Puis tu l'ajoutes à la fenêtre (meme esprit que le .mainloop):
    Code:
    fenetre.config(menu=menubar)

    En quelques sortes, ce code suffirai pour afficher le menu :

    Code:
    import tkinter
    fenetre =Tk()
    menubar = Menu(fenetre)
    filemenu = Menu(menubar)
    filemenu.add_command(label="Quitter", command=fenetre.destroy)
    menubar.add_cascade(label="Menu", menu=filemenu)
    fenetre.config(menu=menubar)
    fenetre.mainloop()

    Ça pourrait faciliter un peu ton interface. Sinon je trouve ton code bien et clair. Il y a toujours plus simple, des commandes bien cachées dans la doc Python etc...
    Je cherche encore ! Smile

    EDIT : Justement Valou, c’est ce pourquoi il a posté il me semble Smile


    _____________________________________________

    .Merci de respecter les quelques règles de comportement du forum.
    .Nous ne fournissons pas de support par messagerie privée.
    .Administrateur/Fondateur.
    http://areaonlan.eu

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Re: Puissance 4

    Message par Waldner le Ven 1 Mar - 11:58

    Merci de vos réponses,

    Valou:
    La seule remarque que je peux te faire est que ton script ne gère pas encore la fin de partie (dès que 4 pions sont alignés, print win et pause).
    Oui je suis entrain de faire quelques recherches pour essayer de trouver une solution pour créer une fonction pas trop complexe capable de vérifier si 4 jetons sont alignés.
    Mais que veut tu dire par "print win et pause"? Question

    Jule04:
    Merci beaucoup pour la commande Menu (je ne la connaissais pas), c'est vrai que ça range l'interface plus lisible.
    Sinon te casse pas la tête pour la fonction de vérification, je demanderai à mon prof de spé info de me donner quelques conseils. Very Happy

    avatar
    Jule04
    Pyministrateur

    Messages : 98
    Date d'inscription : 15/01/2013
    Age : 21
    Localisation : Orléans

    Re: Puissance 4

    Message par Jule04 le Ven 1 Mar - 15:14

    Il veut dire :
    Code:
    Print("Win")
    os.system("pause")#OU
    pause=input("")
    A mon avis.


    _____________________________________________

    .Merci de respecter les quelques règles de comportement du forum.
    .Nous ne fournissons pas de support par messagerie privée.
    .Administrateur/Fondateur.
    http://areaonlan.eu
    avatar
    Valou
    Bogoss du Blitzcrank

    Messages : 29
    Date d'inscription : 30/01/2013
    Age : 22
    Localisation : France

    Re: Puissance 4

    Message par Valou le Ven 1 Mar - 18:01

    Oui voilà je voulais dire ça mais je l'ai dit rapidement pour faire court croyant que vous comprendrez mais non xD
    Sinon pour ce que propose Jul sur le "Menu Windows" pour ton go et ton quitter est vraiment bien, j'ai pu le voir sur un de ses scripts et ça rend bien.

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Re: Puissance 4

    Message par Waldner le Dim 3 Mar - 13:53

    Oui mais le problème est que le programme doit savoir quand il doit afficher le "win".
    Il faut que le programme "détecte" quand 4 jetons sont alignés et ce n'est pas si simple que ça...
    avatar
    Valou
    Bogoss du Blitzcrank

    Messages : 29
    Date d'inscription : 30/01/2013
    Age : 22
    Localisation : France

    Re: Puissance 4

    Message par Valou le Dim 3 Mar - 16:55

    Est-ce que tu pourrais faire une "vérification" pour chaque trous de la grille, donc chercher toutes les possibilités que 4 pions soient alignés. Si tu arriives à faire ça, pour moi, ça devrait marcher Smile

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Re: Puissance 4

    Message par Waldner le Mar 5 Mar - 23:10


    Est-ce que tu pourrais faire une "vérification" pour chaque trous de la grille, donc chercher toutes les possibilités que 4 pions soient alignés. Si tu arriives à faire ça, pour moi, ça devrait marcher
    Effectivement ça pourrait être une solution mais le nombre de solution dans ce jeu est énorme:
    3 par colonnes 4 par lignes et toutes les diagonales où il y a possibilité d'aligner 4 pions.
    Donc chercher toutes les possibilités serais trop long...

    J'ai passé pas mal de temps sur le problème et finalement, pour moi la meilleur solution serait de créer une liste pour chaque colonne et pour chaque ligne
    De ensuite mémoriser la case joué par le joueur la stocker dans les listes qui correspondent à cette case, et lorsque le programme détecte 4 fois la même information alignés dans la liste c'est gagné! Very Happy
    en gros sa donnerai une fonction de ce genre:
    Code:

    def verif(self ,LISTE):
            x, o = "x", "o"
            if len(self.nbrcoup) % 2 ==0:
                    LISTE.append(x)
            else:
                    LISTE.append(o)
            if [x,x,x,x] or [o,o,o,o] in self.LISTE:
                gagner()
    après faut créer toutes les listes donc c'est pas le top comme fonction mais je pense que ça pourrait faire l'affaire pour les lignes et les colonnes, mais pour les diagonales c'est encore un autre problème...


    avatar
    Jule04
    Pyministrateur

    Messages : 98
    Date d'inscription : 15/01/2013
    Age : 21
    Localisation : Orléans

    Re: Puissance 4

    Message par Jule04 le Mer 6 Mar - 17:33

    Ca risque d'être assez long, mais c'est une bonne alternative à mon avis. Après, si ça va marcher, a toi de voir Razz


    _____________________________________________

    .Merci de respecter les quelques règles de comportement du forum.
    .Nous ne fournissons pas de support par messagerie privée.
    .Administrateur/Fondateur.
    http://areaonlan.eu
    avatar
    Valou
    Bogoss du Blitzcrank

    Messages : 29
    Date d'inscription : 30/01/2013
    Age : 22
    Localisation : France

    Re: Puissance 4

    Message par Valou le Mer 6 Mar - 19:19

    Si je comprends bien, tu comptes faire des fonctions pour chaque lignes et chaque colonnes ? Ca revient donc à donner des "coordonnées" à chaque case ?
    Et si je suis le bon raisonnement, si quatre cases côte à côté sont de la même couleur, la personne a gagné ?

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Re: Puissance 4

    Message par Waldner le Jeu 7 Mar - 16:35


    Après, si ça va marcher, a toi de voir

    Je viens d'essayer la fonction à part du programme et çà ne marche pas Crying or Very sad
    je pense que l'erreur vient de cette ligne :
    Code:

    if [x,x,x,x] or [o,o,o,o] in self.LISTE:
    à mon avis çà ne suffit pas pour que le programme détecte si 4 jetons sont alignés...


    Si je comprends bien, tu comptes faire des fonctions pour chaque lignes et chaque colonnes ?
    Oui mais après il y aura surement moyen de faire une fonction global pour toutes les colonnes et les lignes mais pour l'instant de trouver un moyen pour que le programme détecte quand 4 jetons sont alignés.
    Mais apparemment je ne suis pas sur la bonne piste avec ma fonction...
    avatar
    Valou
    Bogoss du Blitzcrank

    Messages : 29
    Date d'inscription : 30/01/2013
    Age : 22
    Localisation : France

    Re: Puissance 4

    Message par Valou le Jeu 7 Mar - 17:00

    Valou a écrit:Ca revient donc à donner des "coordonnées" à chaque case ?

    Et avec une méthode qui se rapproche de cela ? Sad
    Tu devrais donner quatre coordonnées à mon avis. Je m'explique:
    (Vertical, Horizontal, Diagonal (x2) (je ne suis pas trop sûr du fois deux ...)
    EDIT : Non, en fait tu te sers des coordonnées des cases pour dresser du binaire dans une ligne, colonne ou diagonale ...

    Tes cases sont référencés selon leur coordonnées qui leurs permettent de valider une exception:

    Code:

     (G1)  A  B  C  D  E  F  G  (D1)
    6(G2) [ 0, 0, 0, 0, 0, 0, 0 ](D2) 6
    5(G3) [ 0, 0, 0, 0, 0, 0, 0 ](D3) 5
    4(G4) [ 0, 0, 0, 1, 0, 0, 0 ](D4) 4
    3(G5) [ 0, 0, 0, 1, 0, 0, 0 ](D5) 3
    2(G6) [ 0, 0, 0, 1, 0, 0, 0 ](D6) 2
    1(G7) [ 0, 0, 0, 1, 0, 0, 0 ](D7) 1
     (G8)  A  B  C  D  E  F  G  (D8)

    Sur cette exemple, quatre "un" sont alignés verticalement, le code serait alors:
    D = [D1, D2, D3, D4, D5, D6]
    Tu mets du binaire pour dire si oui ou non la case est occupée par un pion joueur (0 ou 1, dans ce cas 1).
    Donc ça donnerait :
    D = [1, 1, 1, 1, 0, 0]
    Ainsi je pense que ça marche.
    Les G1, 2, 3 etc ... représentent les diagonales de gauche, et inversement D1, 2, 3 etc ... celles de droite.
    Et ça marcherait de la même façon :
    G8 = [A1, B2, C3, D4, E5, F6]

    Qu'est-ce que tu en penses ?
    avatar
    Jule04
    Pyministrateur

    Messages : 98
    Date d'inscription : 15/01/2013
    Age : 21
    Localisation : Orléans

    Re: Puissance 4

    Message par Jule04 le Jeu 7 Mar - 17:39

    Tu voudrais analyser toutes les solutions possible et les mettre une par une Val ? Ahum .. Les 1500 lignes de code Razz


    _____________________________________________

    .Merci de respecter les quelques règles de comportement du forum.
    .Nous ne fournissons pas de support par messagerie privée.
    .Administrateur/Fondateur.
    http://areaonlan.eu
    avatar
    Valou
    Bogoss du Blitzcrank

    Messages : 29
    Date d'inscription : 30/01/2013
    Age : 22
    Localisation : France

    Re: Puissance 4

    Message par Valou le Jeu 7 Mar - 17:47

    1) Par fonctions, c'est pas 1500 Razz
    2) Il n'y a pas tant de solutions possibles que ça, si tu veux, je te les compte. De ton côté tu me calcules le nombres de possibilités différentes de faire le rubik's cube 3x3 ? Razz
    avatar
    Jule04
    Pyministrateur

    Messages : 98
    Date d'inscription : 15/01/2013
    Age : 21
    Localisation : Orléans

    Re: Puissance 4

    Message par Jule04 le Jeu 7 Mar - 17:53

    Certe !
    Par contre pour ton cube, il y a 43 252 003 274 489 856 000 possibilités Smile
    Waldner, as-tu trouvé quelque chose ?


    _____________________________________________

    .Merci de respecter les quelques règles de comportement du forum.
    .Nous ne fournissons pas de support par messagerie privée.
    .Administrateur/Fondateur.
    http://areaonlan.eu

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Re: Puissance 4

    Message par Waldner le Jeu 7 Mar - 17:57

    Ta solution est effectivement possible, c'est la plus simple mais la plus longue.

    Et comme je l'ai dit précédemment chercher toute les solutions pour voir si elles ont été jouée est surement faisable dans un jeu comme le puissance 4 mais ce n'est ce que je recherche.
    J'aimerai plutôt créer une fonction qui permettrai de condenser un maximum le code afin de le rendre claire et ça me permettrai de découvrir une manière différente de procéder pour ensuite créer de plus gros programme.
    Car faire une fonction par solution dans un jeu comme le puissance 4 est possible mais dans un jeu ou il y en a nettement plus ça n'aurai aucun intérêt.
    avatar
    Jule04
    Pyministrateur

    Messages : 98
    Date d'inscription : 15/01/2013
    Age : 21
    Localisation : Orléans

    Re: Puissance 4

    Message par Jule04 le Lun 11 Mar - 12:16

    Tu en es où de ton Puissance 4 alors ? Smile


    _____________________________________________

    .Merci de respecter les quelques règles de comportement du forum.
    .Nous ne fournissons pas de support par messagerie privée.
    .Administrateur/Fondateur.
    http://areaonlan.eu

    Waldner
    Pycasso
    Pycasso

    Messages : 13
    Date d'inscription : 09/02/2013
    Age : 21
    Localisation : France

    Re: Puissance 4

    Message par Waldner le Mer 13 Mar - 15:39

    Bah enfaite j'ai pas trop le temps de programmer en ce moment...
    donc j'ai pas trop avancé dessus, j'ai tout de même fait quelques trucs en ajoutant une barre de menu(qui rend l'interface plus "propre")comme tu m'avais montré Very Happy
    Et j'ai commencé les fonctions pour vérifier quand un joueur à gagné.
    ça commence à être script assez grand je trouve, bonne lecture au courageux qui essayeront de lire en entier Very Happy



    Code:

    #------------------------------------
    from tkinter import *
    #----------------------------------
    def cercle(can, x, y, r , couleur):
        """creation d'un cercle en (x, y) de rayon r"""
        can.create_oval(x+r, y+r, x-r, y-r, fill = couleur)


    class Application(Tk):
        def __init__(self):
            ##creation de la fenetre principale avec un canvas et des bouttons
            Tk.__init__(self)##classe parente
            self.can =Canvas(self, width=740, height =680, bg = 'blue')
            self.can.grid(row =5,rowspan= 3, column= 1,columnspan= 7, pady =5)#columnspan = étalement du canvas sur 7 lignes
           
            #---------------------------------------------------------
            menubar =Menu(self)                                        #merci jule04 =)
            fil=Menu(menubar)
            fil.add_command(label ="Go", command= self.grille)
            fil.add_command(label ="aide", command= self.aide)
            fil.add_command(label='Quitter', command= self.destroy)
            menubar.add_cascade(label='Menu', menu= fil)
            self.config(menu= menubar)                                  #commande pour créer une barre de menu
           
            #-----creation des bouttons appellant la fonction jouer-------#
            Button(self, text= "colonne1", command = self.jouer1).grid(row = 2, column= 1)
            Button(self, text= "colonne2", command = self.jouer2).grid(row = 2, column =2)
            Button(self, text="colonne3", command= self.jouer3).grid(row = 2, column=3)
            Button(self,text= "colonne4", command= self.jouer4).grid(row = 2, column=4)
            Button(self,text= "colonne5", command= self.jouer5).grid(row = 2, column=5)
            Button(self,text="colonne6", command= self.jouer6).grid(row = 2, column = 6)
            Button(self,text="colonne7", command= self.jouer7).grid(row =2, column = 7)
            #----------------------------------------------------------------------
            self.matrice = [[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]] # matrice pour les fonctions verif
       
            #----------------------------------------------------------------
           
        def grille(self):#creation des 7colonnes en "stockant" les coordonnnes des cercles dans les listes
            self.liste1, self.liste2, self.liste3, self.liste4, self.liste5, self.liste6, self.liste7 = [], [], [], [],[], [],[]#listes des ordonnes des cercles
            self.x = [] #liste des abscisses
            self.nbrcoup,self.q1, self.q2, self.q3, self.q4,self.q5, self.q6, self.q7 =[], 5,5,5,5,5,5,5##compteurs de la fct jouer
            self.s1 , self.s2, self.s3, self.s4,  self.s5 ,self.s6, self.s7 = 0,0,0,0,0,0,0
            #---------------------------------------------------------------
           
            self.colonnea, self.colonneb, self.colonnec, self.colonned, self.colonnee, self.colonnef, self.colonneg=[],[],[],[],[],[],[]
            #liste stockant la coleur du cercle ajouté
            #--------------------------------------------------------------------

            self.colonne1 = Tableau(self.can, 80, 80 , 45 ,'white', self.liste1, self.x)
            self.colonne2 = Tableau(self.can, 180, 80, 45, 'white', self.liste2, self.x)
            self.colonne3 = Tableau(self.can, 280, 80, 45, 'white', self.liste3, self.x)
            self.colonne4 = Tableau(self.can, 380, 80 ,45 ,'white', self.liste4, self.x)
            self.colonne5= Tableau(self.can, 480, 80 , 45 ,'white', self.liste5, self.x)
            self.colonne6 = Tableau(self.can, 580 , 80 , 45 ,'white' ,self.liste6, self.x)
            self.colonne7 = Tableau(self.can, 680 , 80 ,45 , 'white', self.liste7, self.x)



        #------------------------------------------------------------------
        def col1(self, LISTEX, LISTEY, q, s, LI_VERIF,I,J):
            if len (self.nbrcoup)%2==0:
                cercle(self.can, LISTEX[q], LISTEY[s], 45, 'red')
                self.matrice[I][J]= 1
                Verif(1, self.matrice)
                print (self.matrice)
               
            else:
                cercle(self.can, LISTEX[q], LISTEY[s], 45, 'yellow')
                self.matrice[I][J] = 2
                Verif(2, self.matrice)
                print (self.matrice)
        #fonction qui determine la couleur du cercle à créer en fonction du joueur
        #et qui verrifie à chaque coup joué si 4 jetons sont alignés

    #-------------------------------------------------------

        def jouer1(self):                                              ##les fonctions jouer appelle la fonction col1 pour remplacer un  cercle blanc
            if self.q1>0:                                              ##par un cercle de la couleur du joueur 1 ou 2
                self.col1(self.x,self.liste1, 0, self.q1, self.colonnea,0, self.s1 )                                         
                self.nbrcoup.append("a")
                self.q1 = self.q1-1
                self.s1 = self.s1 +1
            else:
                self.erreur()
        def jouer2(self):
            if self.q2> 0:
                self.col1(self.x,self.liste2, 1, self.q2, self.colonneb,1, self.s2)
                self.q2 = self.q2-1
                self.nbrcoup.append("a")
                self.s2 = self.s2+1
            else:
                return
        def jouer3(self):
            if self.q3>0:
                self.col1(self.x,self.liste3, 2, self.q3, self.colonnec,2, self.s3)
                self.q3 = self.q3-1
                self.nbrcoup.append("a")
                self.s3 = self.s3 +1
            else:
                return
        def jouer4(self):
            if self.q4>0:
                self.col1(self.x,self.liste4, 3, self.q4,self.colonned,3, self.s4)
                self.q4 = self.q4-1
                self.nbrcoup.append("a")
                self.s4 = self.s4+1
            else:
                return
        def jouer5(self):
            if self.q5>0:
                self.col1(self.x,self.liste5, 4, self.q5,self.colonnee, 4, self.s5)
                self.q5 = self.q5-1
                self.nbrcoup.append("a")
                self.s5 = self.s5+1
            else:
                return
        def jouer6(self):
            if self.q6>0:
                self.col1(self.x,self.liste6, 5, self.q6, self.colonnef, 5, self.s6)
                self.q6 = self.q6-1
                self.nbrcoup.append("a")
                self.s6 = self.s6 = self.s6 +1
            else:
                return
        def jouer7(self):
            if self.q7>0:
                self.col1(self.x, self.liste7, 6, self.q7, self.colonneg,6, self.s7)
                self.q7 = self.q7-1
                self.nbrcoup.append("a")
                self.s7= self.s7 +1
            else:
                return
        #---------------------------------------------------------------------
         

        #-----------------------------------------------------------------------
           
        #----------------------------------------------------------------------
        def gagne(self,x):
            fen3= Tk()
            Label(fen3, text="le joueur "+x+ " a gagné.").grid(row= 1, column= 1)
            Button(fen3, text= "quitter", command=  fen3.destroy).grid(row = 2, column= 1)
            Button(fen3, text="recommencer", command= self.grille).grid(row = 3, column = 1)

           
        def aide(self):
            fen4 = Tk()
            Label(fen4, text=" Le jeu ce joue à deux joueurs."
                  "Chaque joueur possède 21 jetons."
                  "Le premier joueur qui arrive à aligner 4 jetons,"
                  "en ligne, en colonne ou en diagonale gagne.").grid(rowspan=3, row= 1, column= 1)
            Button(fen4, text="Ok", command= fen4.destroy).grid(row = 4, column = 1)
                   
        def erreur(self):
            fen2= Tk()
            Label(fen2, text="le nombre de coup limite atteint est atteint").pack()
            Button(fen2, text='ok', command = fen2.destroy).pack()

                #-----------------------------------------------------------------------

           
    class Tableau(object):         
        def __init__(self, canev, x, y, r, couleur, LISTE, LISTx):
            """creation d'une colonne de cercle"""
            self.canev, self.x, self.y, self.r, self.couleur= canev, x, y,r ,couleur
            while y < 600:
                cercle(canev, x , y, r, couleur)
                LISTE.append(y)    #on ajoute l'ordonnée du cercle dans une liste
                y = y+ 100
            LISTx.append(x)        #ajout de l'abscisse dans une liste


           
    class Verif(object):
        def __init__(self, x, M):
            self.x= x
            self.M = M
            #--------------------
            self.verif_colonne(x, M)


       
           
        def verif_colonne(self, x, M):
     
            alignement = False
            i = 0
            j = 0
            while ((alignement ==  False) and (i <= 6)):
                    while ((alignement == False) and (j <= 2)):
                        k = j
                        flag = True
                        while ((flag == True) and (k <= j+3)):
                            if M[i][k] == x:
                                flag = True                 
                            else:
                                flag = False       
                            k = k+1
                        if (k == j+4) and (flag == True):
                            alignement = True
                        else:
                            j = j+1
                    if alignement == False:
                        i = i+1
                        j = 0
            if alignement == True:
                print ("gagne colonne ", i+1)
        def verif_ligne(self, x, M):
            return
           

             
                         

    p = Application()
    p.mainloop()
           
           

    zenithude_web
    Pycasso
    Pycasso

    Messages : 3
    Date d'inscription : 09/02/2017

    Re: Puissance 4

    Message par zenithude_web le Ven 10 Fév - 11:32

    Salut j'ai importé ton code , je vais voir si je peux t'aider pour la fonction finale ..

    J'ai pensé à une solution pour les diagonales , je vais la tester et si ca fonctionne je te la posterai aussi

    Je vais peut etre modifier ton code mais je te reposerai la totalité ici bien entendu ..
    def jouer1(self):                                               ##les fonctions jouer appelle la fonction col1 pour remplacer un  cercle blanc
           if self.q1>0:                                              ##par un cercle de la couleur du joueur 1 ou 2
               self.col1(self.x,self.liste1, 0, self.q1, self.colonnea,0, self.s1 )                                          
               self.nbrcoup.append("a")
               self.q1 = self.q1-1
               self.s1 = self.s1 +1
           else:
               self.erreur()

    if self.q1 >= 0:  

    dans tes fonctions jouer si tu rajoutes = à ton comparateur , tu pourras remplir la derniere ligne ...
    j'ai testé ca fonctionne ...  

    je me pose dessus dans le week end ...  Twisted Evil

    Contenu sponsorisé

    Re: Puissance 4

    Message par Contenu sponsorisé


      La date/heure actuelle est Ven 18 Aoû - 16:26