j'au voulu rajouter des consignesmais du coup ca me fait une fentre trop large... comment revenir a la ligne ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #infos Label(fenetre, text="Cliquez sur 'New Game' pour commencer. Jouez avec les fleches du clavier. Attrapez les ronds verts et evitez les rectangles noirs. A vous de jouer !").pack(padx=0, pady=11)
OK, donc on sait déjà que ce problème va se résoudre dans la fonction new_rond(), puisque c'est là-dedans qu'on crée le rond.
Ensuite que nous faut-il ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 def new_rond ():#faire apparaitre un nouveau rond global rondX, rondY, id_rond # création de l'objet à attraper rondX = randrange(5, 495) rondY = randrange(5, 495) id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green') # end def
- des coordonnées (rondX, rondY) tirées au hasard
- vérifier qu'il n'y a rien dans les alentours de (rondX, rondY)
- s'il n'y a rien => placer le rond
- s'il y a quelquechose : recommencer à l'étape 1
on appelle ça une boucle : on part d'un point A, on passe par divers points B, C, D, puis on revient au point A tant que le problème n'est pas résolu.
comment pourrait-on traduire ça en code Python dans la fonction new_rond() ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 rondX = randrange(5, 495) rondY = randrange(5, 495) if (rondX, rond Y) = 0: id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green') else: #???
Pour les textes avec retour à la ligne, utilisez l'objet tkinter.Message() au lieu de l'objet tkinter.Label() :
on essaie de ne pas trop se disperser ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #infos Message( fenetre, text="Cliquez sur 'New Game' pour commencer.\n" "Jouez avec les fleches du clavier.\n" "Attrapez les ronds verts et evitez " "les rectangles noirs.\n" "A vous de jouer !", width=350, ).pack(pady=5)
concentrons-nous sur la fonction new_rond()...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 # détection de collisions d = dep//4 collisions = canevas.find_overlapping(carreX-d, carreY-d, carreX+10+d, carreY+10+d)
YEAH ! Bravo !
donc canevas.find_overlapping() nous permet de détecter des objets qui ont au moins une intersection avec la zone de coordonnées (x1, y1, x2, y2) avec (x1, y1) le coin supérieur gauche du rectangle imaginaire de la zone et (x2, y2) le coin inférieur droit de cette zone.
comment pourrait-on adapter ce concept pour la fonction new_rond() ?
au temps pour moi, je dis des bêtises : on peut utiliser tkinter.Label() pour des textes à lignes multiples :
c'est peut-être plus simple pour vous, avec Label().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #infos Label( fenetre, text="Cliquez sur 'New Game' pour commencer.\n" "Jouez avec les fleches du clavier.\n" "Attrapez les ronds verts et evitez " "les rectangles noirs.\n" "A vous de jouer !", justify=LEFT, ).pack(pady=5)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 rondX = randrange(5, 495) rondY = randrange(5, 495) if canevas.find_overlapping(rectX, rectY, rectX+20, rectY+10) id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green') else: #???
il faut être plus rigoureuse que ça, manon : j'ai dit que la zone de détection était un rectangle imaginaire de coordonnées (x1, y1, x2, y2).
si vous prenez un point P(x, y) sur un plan orthonormé (i, j), vous pouvez bien tracer un rectangle imaginaire de points H(x-20, y-20) et L(x+20, y+20) tout autour de ce point P, sachant que H représente le coin supérieur gauche de ce rectangle imaginaire et L le coin inférieur droit de ce rectangle imaginaire.
faites un petit croquis sur un bout de papier, ça vous aidera à y voir plus clair.
par conséquent, pourquoi ne pourrions-nous pas exploiter les coordonnées (rondX, rondY) pour en tirer un rectangle imaginaire de coin supérieur gauche H(rondX-20, rondY-20) et de coin inférieur droit L(rondX+20, rondY+20) ?
desolée...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 rondX = randrange(5, 495) rondY = randrange(5, 495) if canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20) id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green') else:
ligne 2 : est-ce que vous pourriez me remettre cette ligne 2 d'aplomb, svp ? pour l'instant, le code est faux si mal tabulé.
ligne 3 : une condition if se termine toujours par ":"
bon, on sait que canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20) va nous retourner une liste d'identifiants IDs de tous les canvasItems qu'il détectera dans cette zone.
si cette liste est vide, la condition if canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20) vaudra False et donc le code qui suivra ne sera pas exécuté.
a contrario, si cette liste est pleine, la condition if canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20) vaudra True et donc le code qui suivra sera exécuté.
or, nous, on veut justement pouvoir poser notre rond quand il n'y a rien dans les alentours de (rondX, rondY), autrement dit, on voudrait pouvoir tester quand la liste est vide et non pas quand elle est pleine.
que doit-on changer dans cette condition pour que ça fonctionne ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager