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

Tkinter Python Discussion :

Probleme avec un jeu.


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2023
    Messages : 2
    Par défaut Probleme avec un jeu.
    Bonjour j'ai un problème avec mon jeu, il ne fonctionne pas correctement. Pourriez vous m'aider ?

    voici le code :

    ############################################################################
    # DM Jeu de mémoire #
    ############################################################################

    from tkinter import *
    import random
    from tkinter import messagebox

    fen=Tk()
    fen.title("jeu de mémoire")
    fen.geometry("800x800")
    ecriture=("comic",12,"bold")

    cadre=Frame (fen)
    cadre.pack()

    cadre2=Frame (fen)
    cadre2.pack()

    #variables gobales
    nb= 8 # nombre de cases par ligne (grille carree)
    c= 50 # dimension d'une case supposée carrée
    x0,y0=20,20 #coordonnées du point en haut à gauche
    current_color = 0 # index du tuple actuel
    varChoix=StringVar()
    colors = [("lavender blush", "lavender")]
    ### DEFINITION DES FONCTIONS ###

    def quitter():
    fen.quit()
    fen.destroy()

    def NewPart():
    global current_color
    np.config(state=DISABLED) # désactiver le bouton "Nouvelle partie"
    for i in range(nb):
    for j in range(nb):
    can.create_rectangle(x0+c*j,y0+c*i,x0+c*(j+1),y0+c*(i+1),fill="lavender blush",width=4,outline="lavender")
    fen.after(1000, computer_play) # appel de la fonction computer_play() après 1 seconde

    def RDJ():
    # Création de la fenêtre pop-up
    popup = Toplevel()
    popup.title("Règles du jeu")
    popup.geometry("800x200")
    # Création de l'étiquette avec le texte à afficher
    label = Label(popup, text="\n\n Mémorisez les cases noires aparraisant sur la grille. Retrouvez les toutes sans vous tromper en cliquant dessus.\n Si vous retrouver toutes les cases, alors votre score augmentera de 1.\n Continuez à jouer jusqu'à ce que vous commettiez une erreur.\n Si vous faites une erreur, le jeu sera terminé.\n Pour jouer à nouveau, appuyez sur le bouton 'Nouvelle partie''.", justify="left")
    label.pack(pady=10)
    # Bouton pour fermer la fenêtre pop-up
    close_button = Button(popup, text="Retour", command=popup.destroy)
    close_button.pack(pady=10)

    def computer_play():
    global current_color
    fill_color, outline_color = colors[current_color]
    current_color = (current_color + 1) % len(colors)
    message['text']=" Le PC joue..."
    positions = random.sample(range(nb*nb), nb) # choix aléatoire de nb positions dans la grille
    for p in positions:
    i = p // nb
    j = p % nb
    can.create_rectangle(x0+c*j, y0+c*i, x0+c*(j+1), y0+c*(i+1), fill="black", width=4, outline="white")
    if varChoix.get()=="Norm":
    fen.after(5000, clear_board)
    elif varChoix.get()=="Rap":
    fen.after(3000, clear_board)
    else :
    fen.after(7000, clear_board)

    def clear_board():
    global current_color
    message['text']=""
    items = can.find_all() # récupérer tous les éléments de la grille
    for item in items:
    fill_color, outline_color = colors[current_color-1]
    if can.itemcget(item, "fill") == "black":
    can.itemconfigure(item, fill=fill_color, outline=outline_color, state='hidden')
    else:
    can.itemconfigure(item, fill="lavender blush", outline="lavender", state='normal')
    current_color = (current_color + 1) % len(colors)

    def click_handler(event):
    global current_color
    message['text']="A votre tour..."
    fill_color, outline_color = colors[current_color]
    item = can.find_closest(event.x, event.y)[0]
    if "revealed" not in can.gettags(item):
    can.itemconfigure(item, fill=fill_color, outline=outline_color)
    can.addtag_withtag("revealed", item)
    black_items = can.find_withtag("black")
    if len(black_items) == 0 and len(can.find_withtag("black")) == len(black_items):
    messagebox.showinfo("Gagné", "Bravo, vous avez gagné !")
    else:
    # Création de la fenêtre pop-up2
    popup2 = Toplevel()
    popup2.title("Perdu !")
    popup2.geometry("400x100")
    # Création de l'étiquette avec le texte à afficher
    label = Label(popup2, text=f"Dommage, c'est perdu !", justify="left")
    label.pack(pady=10)


    ### FIN DEFINITION DES FONCTIONS ###








    ### DEFINITION DES WIDGETS ET AFFICHAGE ###






    ## Création de la 2eme frame ##



    # Création du canvas
    can = Canvas(fen, width=600, height=600)
    can.bind("<Button-1>", click_handler)
    can.pack(side=RIGHT)

    # Quitter
    q=Button(cadre2,text="Quitter",command=quitter,font=ecriture)
    q.pack(side=BOTTOM)

    # Règles du jeu
    rdj=Button(cadre2,text="Règles",command=RDJ,font=ecriture)
    rdj.pack(side=BOTTOM)

    # Nouvelle partie
    np=Button(cadre2,text="Nouvelle partie",command=NewPart,font=ecriture)
    np.pack(side=BOTTOM)

    # Boutons de difficulté
    boutFacile = Radiobutton(cadre,text = "Facile",variable =varChoix,value = "fac")
    boutFacile.pack(side=LEFT)
    boutFacile.select() # Bouton choisi par défault
    boutNormal = Radiobutton(cadre,text = "Normal",variable =varChoix,value = "Norm")
    boutNormal.pack(side=LEFT)
    boutDiff = Radiobutton(cadre,text = "Difficile",variable =varChoix,value = "Rap")
    boutDiff.pack(side=LEFT)

    # Message jeu
    message = Label(fen,text="Veuillez choisir un niveau.")
    message.pack(side = TOP)

    ### FIN DEFINITION DES WIDGETS ET AFFICHAGE ###

    fen.mainloop()

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Bonjour.

    Alors :

    1) un code présenté sans mise en évidence de l'indentation... En Python, c'est rédhibitoire. Comment voulez-vous qu'on sache si l'indentation est correcte ?

    2) on n'a aucune information sur l'erreur rencontrée. Erreur au lancement du programme ? Plantage durant son exécution ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2023
    Messages : 2
    Par défaut
    Bonjour Arioch


    Désolé, j'ai mis le code en pièce jointe afin que l'indentation soit bonne.

    Le problème que je rencontre est sur la fonction click_handler. En fait je souhaite réaliser un jeu ou sur la grille, des cases noires apparaissent et ensuite le joueur doit les retrouver. s'il se trompe, un message perdu s'affiche, s'il retrouve toutes les cases le message gagné s'affiche.

    Le problème est que lorsque je clique sur les cases pour jouer, celles-ci ne redeviennent pas noire et peu importe ou je clique le message "gagné" apparait.
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par bernard2260 Voir le message
    Le problème est que lorsque je clique sur les cases pour jouer, celles-ci ne redeviennent pas noire et peu importe ou je clique le message "gagné" apparait.
    Il y a un "gap"/distance entre ce que vous prétendez vouloir faire et ce que le programme fait... et toute la difficulté de la programmation est qu'on ne se fera pas comprendre par la machine du premier coup: il va falloir apprendre à relire les instructions en les exécutant "mentalement" pour comprendre si ce qu'on lit est cohérent avec ce qu'on constate et pourquoi c'est si éloigné de ce qu'on voulait.

    Concentrez vous sur click_handler. Pour que ça affiche "gagné", il faut que certaines conditions soient réalisées notamment que le nombre d'items avec le tag "black" soit nul. Et a ce moment là, posez vous la question de savoir "comment des items ont bien pu recevoir ce tag?" et de fil en aiguille vous essayez de comprendre ce que vous avez écrit.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Invité de passage
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2023
    Messages : 1
    Par défaut Problème tkinter
    Bonjour, j'ai un problème avec le script suivant. J'aimerai que mon script montre un rond qui se déplace dans une fenêtre, en changeant de couleur à chaque rebond et grossissant à chaque rebond. Dès que le rond est trop gros pour rester dans la fenêtre, le rond doit disparaître et afficher une image d'explosion. Je ne comprends pas pourquoi le rond ne rebondit pas exactement sur les bords de la fenêtre. Voici mon script :

    import tkinter
    from tkinter import *
    import time
    import random

    choix = ["blue", "pink", "red", "orange", "yellow", "purple", "pink", "green"]
    couleur = random.choice(choix)

    fen = Tk()
    fen.geometry("500x500")

    largeur = 500
    hauteur = largeur
    base = 40

    # position initiale aléatoire du rond
    gx = random.randint(base, largeur-base)
    gy = random.randint(base, hauteur-base)

    # vitesse de déplacement
    vx = 5
    vy = 10

    # variable initiale
    a = vx

    # création du canevas
    canevas = Canvas(fen, width = largeur, height = hauteur)
    canevas.pack()

    # Création du rond
    x = random.randint(vx, largeur - vx)
    y = random.randint(vx, largeur - vx)
    rond = canevas.create_oval(x - vx, y - vx, x + vx, y + vx, fill = couleur)

    fichier = PhotoImage(file = 'explo.gif')

    def avancer():
    global gx,gy,vx,vy,couleur,a
    if base <= gx <= largeur and 10 <= gy <= largeur:
    gx = gx + vx
    gy = gy + vy
    if gx < base or gx > 500: # inversion de Vx
    vx = -vx
    gx = gx + vx
    gy = gy + vy
    couleur = random.choice(choix)
    canevas.itemconfig(rond, fill = couleur)
    a += ((a / 100) * 30)
    if gy < base or gy > 500: # inversion de vy
    vy =- vy
    gx = gx + vx
    gy = gy + vy
    couleur = random.choice(choix)
    a += ((a / 100) * 30)
    canevas.itemconfig(rond, fill = couleur)
    if a >= hauteur/2 :
    canevas.delete(ALL)
    image = canevas.create_image(200,200, image = fichier)
    canevas.coords(rond, gx - a, gy - a, gx + a, gy + a)
    canevas.after(base,avancer)

    avancer()
    fen.mainloop()

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par EB8283 Voir le message
    Je ne comprends pas pourquoi le rond ne rebondit pas exactement sur les bords de la fenêtre.
    Parce qu'en testant les coordonnées du centre du disque, la moitié du disque est déjà dehors lorsque la condition devient vraie.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Carte graphique] probleme avec le jeu transformers
    Par RYDGI dans le forum Composants
    Réponses: 5
    Dernier message: 09/09/2009, 01h38
  2. probleme avec jeu démineur
    Par wokba dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 16/01/2008, 18h18
  3. probleme avec un label pour le jeu du puissance 4
    Par lol88 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/10/2007, 18h55
  4. Réponses: 8
    Dernier message: 08/06/2006, 15h48
  5. Réponses: 3
    Dernier message: 26/01/2004, 17h59

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