Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if dep <= 20: dep +=0.1
OUI, tout bêtement.
ou plus brutalement :
on peut aussi l'écrire comme ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part dep = max(dep+0.1, 20)![]()
plusieurs solutions :
* soit on mémorise la position (x, y) d'un rond au moment où on le crée puis on le compare à la position (X, Y) de notre carré
* soit on fait une détection "en aveugle" avec canvas.find_overlapping(), mais avec le problème de l'accélération dep, on risque de ne pas détecter le rond (sauf bidouille)
pour faire disparaître un rond : à sa création, on mémorise son identifiant id_rond de canvasItem :
puis, le moment venu, on le fait disparaître :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 # création de l'objet à attraper pX = randrange(5, 495) pY = randrange(5, 495) id_rond = canevas.create_oval(pX, pY, pX+5, pY+5, outline='white', fill='green')
à vous de jouer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part canevas.delete(id_rond)
ce qu'il y a c'est que je ne connais aucune des deux techniques j'aurai besoin d'un peu plus de précisions ...
pour faire disparaître un rond : à sa création, on mémorise son identifiant id_rond de canvasItem :
puis, le moment venu, on le fait disparaître :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 # création de l'objet à attraper pX = randrange(5, 495) pY = randrange(5, 495) id_rond = canevas.create_oval(pX, pY, pX+5, pY+5, outline='white', fill='green')
ca par contre ca devrait aller !
Code : Sélectionner tout - Visualiser dans une fenêtre à part canevas.delete(id_rond)
à vous de jouer
Quand vous créez votre rond, vous écrivez ceci dans la fonction newgame() :
sauf que pour le moment, ni pX ni pY ne sont globales : une fois la fonction newgame() terminée, l'ordinateur supprimera ces variables car elles sont dites "locales" à la fonction, c'est-à-dire qu'elles n'existent que pour la fonction qui les a créées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 # création de l'objet à attraper pX = randrange(5, 495) pY = randrange(5, 495) id_rond = canevas.create_oval(pX, pY, pX+5, pY+5, outline='white', fill='green')
de plus, pX et pY, ce n'est pas très parlant. il vaudrait mieux les appeler rondX et rondY.
une fois qu'on a fait ça, on peut comparer (rondX, rondY) à (carreX, carreY) dans la fonction move().
c'est plus clair ?
bonjour, j'ai commencé ca mais ca ne marche pas ...
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 #!/usr/bin/env python # -*- coding: utf-8 -*- from random import randrange from Tkinter import * # zone de définition des fonctions def newgame():#definition des aprametres du jeu global X, Y, dep, direction # initialisation de dep dep = 3 # on démarre à 3 pixels # 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') # création de l'obstacle rectX = randrange(5, 495) rectY = randrange(5, 495) id_rect=canevas.create_rectangle(rectX, rectY, rectX+20, rectY+10, outline='black', fill='black') # mise en mouvement possible du carré direction = '' id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) move () # utilisation des flèches du clavier fenetre.bind("<Right>", right) fenetre.bind('<Left>', left) fenetre.bind('<Up>', up) fenetre.bind('<Down>', down) # end def def move():#definitions des mouvements du carré global X, Y, dep, direction # mise en mouvement if direction == 'gauche': carreX -= dep elif direction == 'droite': carreX += dep elif direction == 'haut': carreY -= dep elif direction == 'bas': carreY += dep # end if #acceleration du carré possible if dep <= 20: dep +=0.1 # déplacement du carré canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) # on reprend le prochain pas dans 700 ms fenetre.after(100, move) # Si sortie d'un côté, entrée de l'autre côté if carreY > 500: carreY = 0 elif carreY < 0: carreY = 500 # end if if carreX > 500: carreX = 0 elif carreX < 0: carreX = 500 # end if # === FIXME === # # si collision (carré, rond): # supprimer rond touché # générer nouveau rond aléatoire # générer 2 blocs noirs aléatoires # fin si # end def # directions def left (event):#mouvement vers la gauche global direction direction = 'gauche' # end def def right (event):#mouvement vers la droite global direction direction = 'droite' # end def def up (event):#mouvement vers le haut global direction direction = 'haut' # end def def down (event):#mouvement vers le bas global direction direction = 'bas' # end def # création de l'interface graphique fenetre = Tk() fenetre.title('Jeu Final') # canevas graphique canevas = Canvas(fenetre, width=500, height=500, bg='#046380') canevas.pack(side=TOP, padx=5, pady=5) # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') # init boutons Button(fenetre, text='New Game', command=newgame).pack(side=LEFT, padx=5, pady=5) Button(fenetre, text='Quitter', command=fenetre.destroy).pack(side=RIGHT, padx=5, pady=5) #infos Label(fenetre, text="Cliquez sur 'New Game' pour commencer").pack(padx=0, pady=11) # on lance la boucle principale fenetre.mainloop()
Bonjour,
Voyons :
Je me mets à la place de l'ordinateur et qu'est-ce que je vois ? On utilise des variables rondX et rondY dans canvas.create_oval() sans les avoir initialisées avant ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 def newgame():#definition des aprametres du jeu global x, y, dep, direction # initialisation de dep dep = 3 # on démarre à 3 pixels # création de l'objet à attraper pX = randrange(5, 495) pY = randrange(5, 495) id_rond=canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
C'est comme si je vous demandais de mettre un lanfounet dans votre cabas.![]()
oui mais a combien dois-je initialiser ?
j'ai encore modifié
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 #!/usr/bin/env python # -*- coding: utf-8 -*- from random import randrange from Tkinter import * # zone de définition des fonctions def newgame():#definition des aprametres du jeu global X, Y, dep, direction # initialisation de dep dep = 3 # on démarre à 3 pixels # 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') # création de l'obstacle rectX = randrange(5, 495) rectY = randrange(5, 495) id_rect=canevas.create_rectangle(rectX, rectY, rectX+20, rectY+10, outline='black', fill='black') # mise en mouvement possible du carré direction = '' id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) move () # utilisation des flèches du clavier fenetre.bind("<Right>", right) fenetre.bind('<Left>', left) fenetre.bind('<Up>', up) fenetre.bind('<Down>', down) # end def def move():#definitions des mouvements du carré global X, Y, dep, direction # mise en mouvement if direction == 'gauche': carreX -= dep elif direction == 'droite': carreX += dep elif direction == 'haut': carreY -= dep elif direction == 'bas': carreY += dep # end if #acceleration du carré possible if dep <= 20: dep +=0.1 # déplacement du carré canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) # on reprend le prochain pas dans 700 ms fenetre.after(100, move) # Si sortie d'un côté, entrée de l'autre côté if carreY > 500: carreY = 0 elif carreY < 0: carreY = 500 # end if if carreX > 500: carreX = 0 elif carreX < 0: carreX = 500 # end if # === FIXME === # # si collision (carré, rond): # supprimer rond touché # générer nouveau rond aléatoire # générer 2 blocs noirs aléatoires # fin si # end def # directions def left (event):#mouvement vers la gauche global direction direction = 'gauche' # end def def right (event):#mouvement vers la droite global direction direction = 'droite' # end def def up (event):#mouvement vers le haut global direction direction = 'haut' # end def def down (event):#mouvement vers le bas global direction direction = 'bas' # end def # création de l'interface graphique fenetre = Tk() fenetre.title('Jeu Final') # canevas graphique canevas = Canvas(fenetre, width=500, height=500, bg='#046380') canevas.pack(side=TOP, padx=5, pady=5) # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') # init boutons Button(fenetre, text='New Game', command=newgame).pack(side=LEFT, padx=5, pady=5) Button(fenetre, text='Quitter', command=fenetre.destroy).pack(side=RIGHT, padx=5, pady=5) #infos Label(fenetre, text="Cliquez sur 'New Game' pour commencer").pack(padx=0, pady=11) # on lance la boucle principale fenetre.mainloop()
Et quand vous lancez le script, est-ce que Python vous couine des insanités genre NameError à l'oreille ?
En revanche, vous avez une faute ici :
Rappel (extrait de la doc Tkinter) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10)
Faites aussi attention à vos globales partout dans votre script => l'ordinateur ne peut pas savoir qu'une variable est globale dans une fonction si vous ne le lui dites pas..coords(tagOrId, x0, y0, x1, y1, ..., xn, yn)
If you pass only the tagOrId argument, returns a tuple of the coordinates of the lowest or only object specified by that argument. The number of coordinates depends on the type of object. In most cases it will be a 4-tuple (x1, y1, x2, y2) describing the bounding box of the object.
You can move an object by passing in new coordinates.
non ... j'ai ca
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Exception in Tkinter callback Traceback (most recent call last): File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__ return self.func(*args) File "C:\Users\Manon\Documents\Programme Python\snake.py", line 28, in newgame move () File "C:\Users\Manon\Documents\Programme Python\snake.py", line 55, in move canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) UnboundLocalError: local variable 'carreX' referenced before assignmentcomment reconnaître x de carrex rondx et rectx si je mets juste x ?En revanche, vous avez une faute ici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10)
mais j'ai mis les globales ?Faites aussi attention à vos globales partout dans votre script => l'ordinateur ne peut pas savoir qu'une variable est globale dans une fonction si vous ne le lui dites pas.
Mêmes causes, mêmes effets : les globales.
Où sont passées les déclarations de carreX, carreY en globales, ici ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 def move():#definitions des mouvements du carré global X, Y, dep, direction
Et X et Y : toujours d'actualité ?
Non, canvas.coords() ne retourne pas un id_carre.comment reconnaître x de carrex rondx et rectx si je mets juste x ?
Vous vouliez sans doute dire (en bas du script) :
et par conséquent (dans newgame()) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré #carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') id_carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000')
D'ailleurs, en étant tâtillon, cette ligne ne sert à rien, puisqu'on va retrouver canevas.coords() dans move() à la ligne suivante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 # mise en mouvement possible du carré direction = '' #id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10) canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) move ()
A la limite : drop it!
et non, justement :mais j'ai mis les globales ?
Où sont déclarés rondX, rondY, id_rond, rectX, rectY et id_rect dans global ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 def newgame():#definition des aprametres du jeu global X, Y, dep, direction # initialisation de dep dep = 3 # on démarre à 3 pixels
Pour moi (et pour l'ordi), ces variables sont pour l'instant locales à la fonction.
X et Y toujours d'actualité ?
voila j'ai modifié :
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 #!/usr/bin/env python # -*- coding: utf-8 -*- from random import randrange from Tkinter import * # zone de définition des fonctions def newgame():#definition des aprametres du jeu global rondX, rondY, rectX, rectY, carreX, carreY, dep, direction, id_rond, id_rect, id_carre # initialisation de dep dep = 3 # on démarre à 3 pixels # 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') # création de l'obstacle rectX = randrange(5, 495) rectY = randrange(5, 495) id_rect=canevas.create_rectangle(rectX, rectY, rectX+20, rectY+10, outline='black', fill='black') # mise en mouvement possible du carré direction = '' move () # utilisation des flèches du clavier fenetre.bind("<Right>", right) fenetre.bind('<Left>', left) fenetre.bind('<Up>', up) fenetre.bind('<Down>', down) # end def def move():#definitions des mouvements du carré global carreX, carreY, dep, direction, id_carre # mise en mouvement if direction == 'gauche': carreX -= dep elif direction == 'droite': carreX += dep elif direction == 'haut': carreY -= dep elif direction == 'bas': carreY += dep # end if #acceleration du carré possible if dep <= 20: dep +=0.1 # déplacement du carré canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) # on reprend le prochain pas dans 700 ms fenetre.after(100, move) # Si sortie d'un côté, entrée de l'autre côté if carreY > 500: carreY = 0 elif carreY < 0: carreY = 500 # end if if carreX > 500: carreX = 0 elif carreX < 0: carreX = 500 # end if # === FIXME === # # si collision (carré, rond): # supprimer rond touché # générer nouveau rond aléatoire # générer 2 blocs noirs aléatoires # fin si # end def # directions def left (event):#mouvement vers la gauche global direction direction = 'gauche' # end def def right (event):#mouvement vers la droite global direction direction = 'droite' # end def def up (event):#mouvement vers le haut global direction direction = 'haut' # end def def down (event):#mouvement vers le bas global direction direction = 'bas' # end def # création de l'interface graphique fenetre = Tk() fenetre.title('Jeu Final') # canevas graphique canevas = Canvas(fenetre, width=500, height=500, bg='#046380') canevas.pack(side=TOP, padx=5, pady=5) # init coordonnées du carré carreX, carreY = (235, 250) # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000') # init boutons Button(fenetre, text='New Game', command=newgame).pack(side=LEFT, padx=5, pady=5) Button(fenetre, text='Quitter', command=fenetre.destroy).pack(side=RIGHT, padx=5, pady=5) #infos Label(fenetre, text="Cliquez sur 'New Game' pour commencer").pack(padx=0, pady=11) # on lance la boucle principale fenetre.mainloop()
Ah ? Presque :
Qui donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000')
Beute ouaille ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__ return self.func(*args) File "./manon+snake.py", line 28, in newgame move () File "./manon+snake.py", line 55, in move canevas.coords(id_carre, carreX, carreY, carreX+10, carreY+10) NameError: global name 'id_carre' is not defined![]()
Partager