Déplacement de canevas / Remplacement de variable
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
Ainsi, le déplacement du pion serait réalisé à partir d'un If de résultat de dé, puis d'un
Je n'arrive pas à faire fonctionner ce système, pourriez-vous s'il vous plaît corriger mon code?
Merci!
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
ifcontenant 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
ifde position avant lancer de dé. Je pense qu'il faut donc utiliser un
global Xj, Yjcar 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:
- Déplacement de canevas / Remplacement de variable
- Remplacement coco - Accueil - Réseaux sociaux
- Coco.fr remplacement - Accueil - Réseaux sociaux
- Canevas gratuit - Télécharger - Divers Photo & Graphisme
- Historique déplacement google - Guide
- Vivastreet rencontre remplacement ✓ - Forum Réseaux sociaux
1 réponse
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 :
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 :
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
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