Déplacement de canevas / Remplacement de variable

Fermé
lilylprt - Modifié le 29 avril 2019 à 10:01
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 29 avril 2019 à 10:08
Bonjour !

Dans le code ci-dessous, j'aimerais créer le déplacement d'un pion (cheval) contenu dans un canevas, grâce à un imbriquement de
if
contenant des positions en pixels. Par exemple :

# Canevas contenant le pion, 42 étant de pas entre chaque case du plateau 
chevalj = Canvas(plateau, height=42, width=42)

# Pour placer le caneva du pion au centre de la case, peut-être que placer
# Xj et Yj dès maintenant pose problème pour plus-tard donc il suffit de
# changer directement la valeur numérique initiale de Xj et Yj, comme ça
# on appelle pas Xj/Yj dès le départ...
chevalj.place(x = Xj - 21,y = Yj - 21)
chevaljaune = PhotoImage(file = 'chevaljaune.gif')
chevalJ = chevalj.create_image(21, 21, image = chevaljaune)  #Image du pion
Xj = 168
Yj = 168  #Positions initiales du pion

#...

if nb == 3  #Résultat du lancer de dé
    if Xj == 168 and Yj == 168
        # Le personnage avance de 3 cases (ici, en réalité, il quitte le box de départ
        # et va se placer sur la première case du parcours)
        Xj = 42
        Yj = 294
        #"Plateau" étant un canevas contenant le canevas chevalj
        plateau.move(chevalj, Xj, Yj)


Ainsi, le déplacement du pion serait réalisé à partir d'un If de résultat de dé, puis d'un
if
de position avant lancer de dé. Je pense qu'il faut donc utiliser un
global Xj, Yj
car ces variables changeront constamment, mais je n'y arrive pas. Pour l'instant je n'ai codé qu'un seul cas (quand le joueur est dans le boxe et qu'il fait 6, donc il va sur la première case du parcours) mais il faudrait le faire pour chaque résultat du dé et pour chaque position du pion (c'est très long donc j'aurais besoin de votre aide pour que le principe fonctionne...)

Je n'arrive pas à faire fonctionner ce système, pourriez-vous s'il vous plaît corriger mon code?

from tkinter import *
from random import *

ecran = Tk()
ecran.title('Petits Chevaux')
ecran.attributes('-fullscreen',1)
ecran.configure(background = 'light grey')
titre = Label(
    ecran,
    text = 'JEU DES PETITS CHEVAUX',
    font = 'tk.meHelvetica 18 bold underline',
    background = 'light grey'
)
titre.pack(padx = 10, pady = 10)

hauteur = 714
largeur = 714

plateau = Canvas(ecran, bg = 'white', height = hauteur, width = largeur)
plateau.pack()

fichier_img = PhotoImage(file = 'plateauphoto.gif')
img = plateau.create_image(357 ,357, image = fichier_img)

Xj = 168
Yj = 168
Xb = 546
Yb = 168
Xv = 168
Yv = 546
Xr = 546
Yr = 546

chevalj=Canvas(plateau, height=42, width=42)
chevalj.place(x=Xj-21,y=Yj-21)
#chevalj.attributes('-alpha', 0) (je voulais essayer de mettre un fond trasnparent au canva...)
chevaljaune=PhotoImage(file='chevaljaune.gif')
chevalJ=chevalj.create_image(21,21,image=chevaljaune)
chevalbleu=PhotoImage(file='chevalbleu.gif')
chevalb=plateau.create_image(Xb,Yb,image=chevalbleu)
chevalvert=PhotoImage(file='chevalvert.gif')
chevalv=plateau.create_image(Xv,Yv,image=chevalvert)
chevalrouge=PhotoImage(file='chevalrouge.gif')
chevalr=plateau.create_image(Xr,Yr,image=chevalrouge)

def boutonsfin():
    FenetreFin=Toplevel(ecran)
    FenetreFin.title('Confirmation')
    FenetreFin.geometry('142x52')
    quitterOrester=Label(FenetreFin,text="CONFIRMER?")
    quitterOrester.pack()
    BoutonQuitter=Button(
        FenetreFin,
        text='CONFIRMER',
        activebackground='light grey',
        command=ecran.destroy
    )
    BoutonQuitter.pack(side=LEFT)
    BoutonRester=Button(
        FenetreFin,
        text='ANNULER',
        activebackground='light grey',
        command=FenetreFin.destroy
    )
    BoutonRester.pack(side=RIGHT)
    
def lancerde():
    FenetreDe=Toplevel(ecran)

    def alea():
        nb=randint(1,3)

        if nb==1 :
            FenetreDe.destroy()
            FenetreDeEffectue=Toplevel(ecran)
            res=Label(FenetreDeEffectue,text='Résultat : '+str(nb), fg='red')
            res.pack(padx=15,pady=10)
            imgde = Canvas(FenetreDeEffectue,bg='white',height=100,width=100)
            imgde.pack(side=TOP)
            img=PhotoImage(file='face1.gif')
            photo=imgde.create_image(50,50,image=img)
            FenetreDeEffectue.mainloop()
            
        
        if nb==2 :
            FenetreDe.destroy()
            FenetreDeEffectue=Toplevel(ecran)
            res=Label(FenetreDeEffectue,text='Résultat : '+str(nb), fg='red')
            res.pack(padx=15,pady=10)
            imgde = Canvas(FenetreDeEffectue,bg='white',height=100,width=100)
            imgde.pack(side=TOP)
            img=PhotoImage(file='face2.gif')
            photo=imgde.create_image(50,50,image=img)
            FenetreDeEffectue.mainloop()
        
        if nb==3 :
            rejouertrois=Toplevel(FenetreDe)
            texte=Label(rejouertrois,text='Vous avez fait 3, rejouez !', width=20,height=1,fg="black")
            texte.pack()
            imgde = Canvas(rejouertrois,bg='white',height=100,width=100)
            imgde.pack(side=TOP)
            img=PhotoImage(file='face3.gif')
            photo=imgde.create_image(50,50,image=img)
            bououtonquittefentre3=Button(rejouertrois,text='Quitter',command=rejouertrois.destroy)
            bououtonquittefentre3.pack(side=BOTTOM)
            rejouertrois.mainloop()
            global Xj
            global Yj
            
            if Xj==168 and Yj==168 :
                Xj=42
                Yj=294
                plateau.move(chevalj,Xj,Yj)
                #plateau.update() (je ne sais pas si cela est utile, j'ai
                #juste testé plusieurs choses dans l'espoir que ça fonctionne)
                #plateau.mainloop() (même chose)
                

    boutonlancedede=Button(FenetreDe,text='Lancer le dé',command=alea)
    boutonlancedede.pack(side=TOP)
    FenetreDe.mainloop()


BoutonDe=Button(ecran,text='LANCER LE DÉ',command=lancerde)
BoutonDe.pack()
BoutonDe.place(relx=0.1, rely=.5)
BoutonFin=Button(ecran,text='FIN DU JEU', command=boutonsfin)
BoutonFin.pack()
BoutonFin.place(relx=.5, rely=.95)
plateau.mainloop()
ecran.mainloop()


Merci!
A voir également:

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
29 avril 2019 à 10:08
Bonjour,

Tu n'as pas besoin de variables globales. On peut presque toujours s'en passer, et généralement faire une variable globale est de toute façon une très mauvaise idée. Dans ton cas, il faut simplement passer les variables d'une fonction à l'autre en les passant en paramètres.

Exemple :

def f(xi, xj):
  print(xi, xj)

def g(xi, xj):
  f(xi, xj)
  f(2*xi, 3*xj)

g(10, 20)


Ainsi tu pourras écrire des fonctions qui marcheront pour tout xi et pour tout xj et tu n'auras pas plein de cas à écrire. Ensuite je te recommande d'indenter selon les recommandations PEP8 de python, ton programme sera plus lisible. Essaye en outre de faire des lignes courtes (80 caractères max), de mettre des espaces autour des opérateurs et derrières les virgules.

Par ailleurs les conventions de notations en python sont :

une_variable = 25
UNE_CONSTANTE = 17

class UneClasse:
  pass

def une_fonction():
  pass


Cet effort vaut le coup, pour toi (plus facile à lire et d'être relu, et donc d'avoir des réponses quand tu interroges un forum) comme pour nous :p

Bonne chance
0