et dans le code, ça donnerait quoi ?
Version imprimable
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:
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: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 ...
Citation:
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:
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: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:
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:
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:
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:
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: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.Citation:
.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 caCode:
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 assignment
comment reconnaître x de carrex rondx et rectx si je mets juste x ?Citation:
En revanche, vous avez une faute ici :
Code:id_carre=canevas.coords(carre, carreX, carreY, carreX+10, carreY+10)
mais j'ai mis les globales ?Citation:
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:
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.Citation:
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:
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:
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 :Citation:
mais j'ai mis les globales ?
Où sont déclarés rondX, rondY, id_rond, rectX, rectY et id_rect dans global ?Code:
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:
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:
1
2 # dessin du carré carre = canevas.create_rectangle(carreX, carreY, carreX+10, carreY+10, outline='white', fill='#C03000')
Beute ouaille ? :mrgreen:Code:
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