IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Besoin d'aide pour finaliser un jeu puissance 4 ecrit en python [Python 3.X]


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Besoin d'aide pour finaliser un jeu puissance 4 ecrit en python
    Bonjour,

    J'ai ecrit le programme python ci-joint pour faire un jeu puissance 4.

    Il est simple mais je n'optient pas ce que je veux comme le jeu réel. En fait j'ai l'impression que les couleurs sont definies à l'avance a l'initialisation des cases dans la grille. Et des fois on peux avoir la meme deux fois de suite selon la case ou on clique, ce qui est une erreur.

    Si vous pouviez m'aider a faire que la couleur change dynamiquement quand on clique sur une case vide.





    Merci pour votre aide



    Cdt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import tkinter as tk
     
    def color(button):
        def col():
            button['bg']='red'
        return col
     
    def color2(button):
        def col2():
            button['bg']='yellow'
        return col2
     
    class Application:
        def __init__(self,p):
            self.init_modele(p)
            self.init_widgets(p)
     
        def init_modele(self,p):
            self.p=p
     
        def init_widgets(self,p):
            self.presentation=tk.Label(fenetre,text="Puissance 4")
            self.jouer=tk.Button(fenetre,text="Lancer une partie",command=self.puissance)
            self.presentation.pack()
            self.jouer.pack()
            self.t=tk.IntVar()
            self.t=1
     
        def puissance(button):
            app=tk.Tk()
            t=1
            for i in range(0,6):
                for j in range(0,7):
                    button = tk.Button(app,height=5,width=10 , bg='white')
                    button.grid(row=i, column=j)
     
                    for k in range(0,43):
                        if t%2==1:
                            button['command']=color(button)
                            t+=1
                        else:
                            button['command']=color2(button)
                            t+=1
            app.mainloop
     
     
    fenetre=tk.Tk()
    App=Application(1)
    fenetre.mainloop()
    Fichiers attachés Fichiers attachés
    • Type de fichier : py tm4.py (1,2 Ko, 187 affichages)

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Saut,

    Tu t'étonnes que ce soit défini à l'avance, pourtant c'est ce que ton code fait, bon y'a vraiment trop d'incohérences dans ton code, à quoi sert la variable p, l'attribut p de ta classe ? Mystère et boule de gomme.

    Que fait ta fonction puissance dans ta classe Application ?

    A quoi sert ta variable tkinter ? vu que tu l'écrases aussi sec, par un = 1 ? Qu sert à rien de plus.

    Un jeu de puissance 4 est simple à faire.

    - En premier, génération des cases.
    - En second utiliser 2 couleurs (pour les joueurs)
    soit dans 2 variables distinctes qu'il suffira d'inverser à chaque clic effectué couleurA, couleurB = couleurB, couleurA et donc seule couleurA sera utilisée
    ou dans une simple liste sur laquelle on fera un reverse à chaque clic en utilisant toujours l'index 0
    - maintenant c'est simple, à chaque clic, tu remplis le bouton de cette couleur.
    - Et voilà, la base est faite, le plus dur reste à venir pour mettre un terme au jeu si 4 cases de même couleurs sont alignées.

    Ah, tu devrais te passer d'utiliser de l'objet et de t'en tenir à de simples fonctions, car la classe que tu as fait est beurk, commence d'abord à bien maîtriser les fonctions et bases de python avant de t'attaquer à modéliser une application en objet.

    Bonne chance
    Le temps ronge l'amour comme l'acide.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci à toi bistouille.

    J'aurais bien aimer trouver un exemple simple de programme puissance 4 écrit en python afin de comprendre.
    J'ai trouver des exemples sur le net par contre ils sont trop complexe (gestion des position, des lignes gagnantes ...) mais complexe à comprendre. Je trouve que l'Api tkinter est complexe.


    Merci
    Cdt

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Le problème n'est pas l'api de tkinter, mais d'utiliser les bons widgets, une liste de boutons pour faire ce jeu n'est pas du tout l'idéal, un canevas est plus approprié pour le faire, de plus tu pourras créer des formes diverses pour les pions.

    Partant de ça, la première chose à faire est de générer un simple dictionnaire (dict) de tes cases, avec pour clés les numéros de cases, et valeurs les coordonnées x, y, x2, y2 qui représentent donc :

    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     y
    x ----
     |    |
     |    |
      ---- x2
          y2

    De façon à obtenir pour une grille de 10 cases de côté, et 40 unités de côté :

    {1: (0, 0, 40, 40),
    2: (40, 0, 80, 40),
    3: (80, 0, 120, 40),
    4: (120, 0, 160, 40),
    5: (160, 0, 200, 40),
    ....
    96: (200, 360, 240, 400),
    97: (240, 360, 280, 400),
    98: (280, 360, 320, 400),
    99: (320, 360, 360, 400),
    100: (360, 360, 400, 400)}

    C'est seulement ceci fait, que tu pourras commencer à utiliser tkinter.

    Et si tu as du mal, fais une recherche sur la génération d'un simple damier avec tkinter.
    Ce sera du code tout cuit, mais si ça te permet de comprendre.

    Quand tu auras réussi à générer un simple plateau de cases dans un canevas, il ne te restera plus qu'à faire la partie événementielle, ce sera simple, d’autant que Canvas possèdent des méthodes bien pratiques pour faire le travail.
    Le temps ronge l'amour comme l'acide.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci Bistouille.

    J'ai pu faire ce que tu m'as demandé pour le graphisme. Je n'ai pas utilisé d'objets mais que les classe statiques de tkinter sans créer ma propre classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #Création d'une fenetre
    Fenetre= Tk()
    # Creation widget Canvas à ajouter dans la fenetre
    Canevas = Canvas(Fenetre, width = 600, height =400, bg ='white')
    # Création des Cases
    for x in range(1,6):
        for y in range(0,5):
           Canevas .create_oval(self, *args, **kw) #j'ai changé les parametres dans le programme
     
    # ajout de l'evenement click
    Canevas.bind('<Button-1>', clicJouer)
    Par contre je bloque pour changer la couleur car je ne peux pas déclarer de variable couleur comme je n'ai pas définit ma propre classe. La variable doit etre globale et non locale à la methode "clicJouer". Je ne sais pas si je doit redessiner un oval ou colorier sur l'existant (pour les deux je ne sais pas comment faire)
    Je suis preneur pour de l'aide sur ces points.


    Merci

  6. #6
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hocinemal Voir le message
    Par contre je bloque pour changer la couleur car je ne peux pas déclarer de variable couleur comme je n'ai pas définit ma propre classe.
    Je t'ai pourtant précisé comment faire, plus haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import tkinter as tk
     
    couleurs = ['green', 'lightBlue']
     
    fenetre = tk.Tk()
     
    plateau = tk.Canvas(fenetre, width = 600, height =400, bg ='white')
     
    def clicJouer(evt) :
        print(couleurs[0])
        couleurs.reverse()
     
    fenetre.bind('<Button-1>', clicJouer)
     
    fenetre.mainloop()
    C'est simple non ?


    Citation Envoyé par hocinemal Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for x in range(1,6):
        for y in range(0,5):
           Canevas .create_oval(self, *args, **kw) #j'ai changé les parametres dans le programme
    i
    Ce n'est pas comme ça qu'il faut faire, c'est le y d'abord, et le x ensuite, on part en haut à gauche pour finir en bas à droite en générant des lignes, et le plus simple est d'utiliser une unique boucle et un modulo.

    Citation Envoyé par hocinemal Voir le message
    Merci Bistouille
    Je t'en prie
    Le temps ronge l'amour comme l'acide.

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Encore merci Bistouille

    As tu un site qui décrit bien la librairie tkinter? Je n'ai pas réussi à en trouver un qui décrit qu'on peux utiliser la variable couleurs qui est déja définie.

    L'inversion des couleurs est tres bien car cela evite de le gérer sois même avec des conditions.

    C'est complexe pour moi d'utiliser le dictionnaire mais je vais faire un truc simple ou le joueur cliquera toujours a partir du bas.
    J'ai un autre soucis c'est comment la variable ovale (pion crée par create_oval et sur lequel on clique):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def clicJouer(evt) :
        print(couleurs[0])
        canvasWidget = event.widget
        pion = canvasWidget. # je ne voit pas la methode pour récuperer le pion sur lequel on a cliquer
        pion. # changer couleur
        couleurs.reverse()

    Merci

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hocinemal Voir le message
    Encore merci Bistouille

    As tu un site qui décrit bien la librairie tkinter? Je n'ai pas réussi à en trouver un qui décrit qu'on peux utiliser la variable couleurs qui est déja définie.
    Il y a http://infohost.nmt.edu/tcc/help/pub...web/index.html , notamment car il y a un pdf téléchargeable et très bien détaillé.

    Sinon, ce que tu peux faire, c'est utiliser pydoc, si t'as le bonheur d’être sur linux, un simple :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    python3 -m pydoc -b

    Dans un terminal ouvrira ton navigateur sur toutes les bibliothèques présentes de python et évidemment tkinter.

    Si t'es sur windows, i faut ouvrir une console dos, te placer dans le répertoire de python (qui est à la racine du dd) avec cd, et utiliser la même commande mais en remplaçant python3 par python.exe (j'ai jamais testé, mais pas de raison que ça fasse pas la même chose)

    Sinon, de la doc, des exemples avec tkinter c'est pas ça qui manque sur internet.


    Citation Envoyé par hocinemal Voir le message
    C'est complexe pour moi d'utiliser le dictionnaire mais je vais faire un truc simple ou le joueur cliquera toujours a partir du bas.
    Un dictionnaire n'est rien d'autre qu'un tableau associatif, clé=>valeur, y'a rien de compliqué là-dedans.


    Citation Envoyé par hocinemal Voir le message
    J'ai un autre soucis c'est comment la variable ovale (pion crée par create_oval et sur lequel on clique):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def clicJouer(evt) :
        print(couleurs[0])
        canvasWidget = event.widget
        pion = canvasWidget. # je ne voit pas la methode pour récuperer le pion sur lequel on a cliquer
        pion. # changer couleur
        couleurs.reverse()
    i
    C'est quoi event.widget ?
    Ce que transmet tkinter lorsqu'on clique sur un widget se passe dans evt, et ce qui t'intéresse est evt.x, evt.y

    Mais tout ça est déjà expliqué dans le tuto de swinnen https://python.developpez.com/cours/TutoSwinnen/

    Et c'est pour justement ton problème que je t'avais conseillé de générer toutes les coordonnées des cases, ça sera bien plus facile pour chercher dans quelle case se situe ces evt.x et evt.y
    Le temps ronge l'amour comme l'acide.

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour ces infos.

    En fait event.widget te retourne le canevas.

    J'ai pu utiliser le dictionnaire pour ajouter les référence (x, y, x1, y1). Lors d'un click, je parcours le dictionnaire et event.x et event.y doivent supérieur aux références du dictionnaire. Ainsi, je peux colorier exactement le pion dans le cercle.
    Ca marche bien.

    Mais je ne sais pas du tout comment gérer la ligne gagnante. Je suis preneur d'idées pour le faire et donc savoir comment gérer les différents alignements de 4 pions de la même couleur.

    Merci

    Cdt

  10. #10
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hocinemal Voir le message
    Mais je ne sais pas du tout comment gérer la ligne gagnante. Je suis preneur d'idées pour le faire et donc savoir comment gérer les différents alignements de 4 pions de la même couleur.
    Pour gérer les pions de chaque couleurs, 2 simples list suffisent, une pour chaque joueur, à chaque clic, tu insères ne n° de case cliqué sans ces listes à tour de rôle.

    Maintenant pour déterminer si 4 pions sont alignés, il suffit à partir d'une case cliquée X, par exemple pour l'horizontal de vérifier si y'a un X+1, X+2, X+3, idem pour le négatif X-1, X-2, X-3.
    Et ça une simple boucle avec un compteur le fait.

    Commence déjà par tester les horizontales, ensuite les verticales, et pour les diagonales, il faut faire de la réflexion,et déterminer quelles sont les relations des cases diagonales, je te laisse chercher.

    EDIT :
    Il y a un autre point à gérer, le fait que pas n'importe quelle case peut être jouée, donc soit c'est sur la 1ère ligne (ligne du bas donc), soit que la case jouée a sous elle-même une autre case déjà jouée.
    Images attachées Images attachées  
    Le temps ronge l'amour comme l'acide.

  11. #11
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Ok merci Bistouille. J'ai crée deux listes rouge et jaune pour les alimenter avec le numéro du pion colorier (le numéro est la clé des references du pion dans le dictionnaire).
    J'ai définit les différents cas de lignes et ca marche bien.

    Par contre une derniere chose, comment réinitialiser le jeu (nouveau jeu) avec un boutton(comand=). Je ne peux pas faire new car je n'ai pas créer un classe canevas. Tout est statique.

    Merci

  12. #12
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Pour réinitialiser, tout dépend comment est construit ton code, mais de toute façon c'est par une fonction que tout doit se passer.

    Et c'est pas parce qu'on utilise pas d'objets que c'est statique, on peut quasiment tout faire en procédural ce qu'on peut faire en objet
    Le temps ronge l'amour comme l'acide.

  13. #13
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Ok je vais regarder s'il n'y a pas de méthodes de reinitialisation de ces classes graphique.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour projet ISN: jeu de plateau
    Par Stilishh dans le forum Programmation multimédia/Jeux
    Réponses: 4
    Dernier message: 17/05/2014, 07h39
  2. Réponses: 17
    Dernier message: 17/06/2012, 13h17
  3. [XL-2002] Besoin d'aide pour finaliser Macro mise en forme + bordure
    Par warrio67 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/03/2010, 05h23
  4. [Débutant] Besoin d'aide pour modifier un jeu
    Par stoff66 dans le forum Assembleur
    Réponses: 9
    Dernier message: 31/08/2006, 18h24
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo