2 réponses
Bonsoir.
Il faudrait voir l'intégralité de ton programme, car difficile de tester sans voir à quoi tu veux aboutir.
Une chose m'étonne :
Tu déplaces 50 fois l'élément black sans faire des test de collisions, donc à mon avis, ça ne peut pas fonctionner. D'ailleurs pourquoi le déplacer sur des positions aléatoires si le x est inférieur à 0 ? Quelle logique as-tu établi ici ?
Ces portions peuvent devenir plus limpide en utilisant le * pour faire de l'unpacking.
Tu n'as pas besoin non plus d'utiliser len, puisqu'une liste vide sera évaluée à False.
Tu peux aussi abréger
Il y a aussi un abus de déclaration de var global, d'après ce que j'en vois, seules dx et dy ont besoin d'être globales.
Je pense quand même que ton problème émane de ta boucle for.
Il faudrait voir l'intégralité de ton programme, car difficile de tester sans voir à quoi tu veux aboutir.
Une chose m'étonne :
for i in range(50): x,y,=randrange(480),randrange(480) can1.coords(black,x,y,x+30,y+30)
Tu déplaces 50 fois l'élément black sans faire des test de collisions, donc à mon avis, ça ne peut pas fonctionner. D'ailleurs pourquoi le déplacer sur des positions aléatoires si le x est inférieur à 0 ? Quelle logique as-tu établi ici ?
if len(can1.find_overlapping(can1.coords(boule)[0],can1.coords(boule)[1],\ can1.coords(boule)[2],can1.coords(boule)[3]))>1>1
Ces portions peuvent devenir plus limpide en utilisant le * pour faire de l'unpacking.
Tu n'as pas besoin non plus d'utiliser len, puisqu'une liste vide sera évaluée à False.
if can1.find_overlapping(*can1.coords(boule)): # code
Tu peux aussi abréger
dy=-1*dypar
dy *= -1
Il y a aussi un abus de déclaration de var global, d'après ce que j'en vois, seules dx et dy ont besoin d'être globales.
Je pense quand même que ton problème émane de ta boucle for.
voici le code entier ,les variable en plus c'est p;lus tard :from tkinter import*
from random import*
from math import *
fen=Tk()
can1=Canvas(fen,height=500,width=500,bg="red")
can1.pack(side=RIGHT)
posx=200
posy=10
dx=5
dy=5
flag=0
vx=cos(1)
ms=25
x2=100
y2=100
x=1
y=1
fen.title("jeu")
boule=can1.create_rectangle(200,200,210,250,fill="yellow")
black=can1.create_oval(posx,posy,posx+30,posy+30,fill="black")
cage=can1.create_rectangle(400,250,500,260,fill="brown")
cage2=can1.create_rectangle(400,200,500,210,fill="brown")
trai_gagnant=can1.create_line(400,210,400,250,fill="red")
if black >trai_gagnant:
score =+1
def start ():
global flag,ms
if flag ==0:
flag=1
deplacement()
def stop ():
global flag,score
flag=0
score=0
print("score :",score)
def droite(event):
can1.move(boule,10,0)
def gauche(event):
can1.move(boule,-10,0)
def haut (event):
can1.move(boule,0,-10)
def bas(event):
can1.move(boule,0,10)
def deplacement ():
global dx,dy,ms,x,y
if can1.coords(black)[3]>500 or can1.coords(black)[1]<0:
dy=-dy
if can1.coords(black)[2]>500:
dx=-dx
if can1.coords(black)[0]<0:
x,y=randrange(480),randrange(480)
can1.coords(black,x,y,x+30,y+30)
if len( can1.find_overlapping(can1.coords(boule)[0],can1.coords(boule) [1],can1.coords(boule)[2],can1.coords(boule)[3]))>1:
dy=-dy
dx=-dx
if len(can1.find_overlapping(can1.coords(cage)[0],can1.coords(cage) [1],can1.coords(cage)[2],can1.coords(cage)[3]))>1:
dy=-dy
dx=-dx
if len(can1.find_overlapping(can1.coords(cage2)[0],can1.coords(cage2) [1],can1.coords(cage2)[2],can1.coords(cage2)[3]))>1:
dy=-dy
dx=-dx
can1.move(2,dx,dy)
if flag>0:
fen.after(ms,deplacement)
b_start=Button(fen,text="start",command=start)
b_start.pack()
b_stop=Button(fen,text="stop",command=stop)
b_stop.pack(side=LEFT)
bu_quit=Button(fen,text="quit",bg="green",command=fen.destroy)
bu_quit.pack(side=BOTTOM)
fen.bind("<Right>",droite)
fen.bind("<Left>",gauche)
fen.bind("<Up>",haut)
fen.bind("<Down>",bas)
fen.mainloop()
from random import*
from math import *
fen=Tk()
can1=Canvas(fen,height=500,width=500,bg="red")
can1.pack(side=RIGHT)
posx=200
posy=10
dx=5
dy=5
flag=0
vx=cos(1)
ms=25
x2=100
y2=100
x=1
y=1
fen.title("jeu")
boule=can1.create_rectangle(200,200,210,250,fill="yellow")
black=can1.create_oval(posx,posy,posx+30,posy+30,fill="black")
cage=can1.create_rectangle(400,250,500,260,fill="brown")
cage2=can1.create_rectangle(400,200,500,210,fill="brown")
trai_gagnant=can1.create_line(400,210,400,250,fill="red")
if black >trai_gagnant:
score =+1
def start ():
global flag,ms
if flag ==0:
flag=1
deplacement()
def stop ():
global flag,score
flag=0
score=0
print("score :",score)
def droite(event):
can1.move(boule,10,0)
def gauche(event):
can1.move(boule,-10,0)
def haut (event):
can1.move(boule,0,-10)
def bas(event):
can1.move(boule,0,10)
def deplacement ():
global dx,dy,ms,x,y
if can1.coords(black)[3]>500 or can1.coords(black)[1]<0:
dy=-dy
if can1.coords(black)[2]>500:
dx=-dx
if can1.coords(black)[0]<0:
x,y=randrange(480),randrange(480)
can1.coords(black,x,y,x+30,y+30)
if len( can1.find_overlapping(can1.coords(boule)[0],can1.coords(boule) [1],can1.coords(boule)[2],can1.coords(boule)[3]))>1:
dy=-dy
dx=-dx
if len(can1.find_overlapping(can1.coords(cage)[0],can1.coords(cage) [1],can1.coords(cage)[2],can1.coords(cage)[3]))>1:
dy=-dy
dx=-dx
if len(can1.find_overlapping(can1.coords(cage2)[0],can1.coords(cage2) [1],can1.coords(cage2)[2],can1.coords(cage2)[3]))>1:
dy=-dy
dx=-dx
can1.move(2,dx,dy)
if flag>0:
fen.after(ms,deplacement)
b_start=Button(fen,text="start",command=start)
b_start.pack()
b_stop=Button(fen,text="stop",command=stop)
b_stop.pack(side=LEFT)
bu_quit=Button(fen,text="quit",bg="green",command=fen.destroy)
bu_quit.pack(side=BOTTOM)
fen.bind("<Right>",droite)
fen.bind("<Left>",gauche)
fen.bind("<Up>",haut)
fen.bind("<Down>",bas)
fen.mainloop()
Bonjour.
Canvas.find_overlapping retourne une liste d'identifiants du canevas chevauchant le quadrlatère des coordonnées spécifiées.
Donc, ce que tu dois vérifier est que parmi ces identifiants ne se trouve pas ceux de tes obstacles (cage, cage2, boule).
Tu n'as besoin d'utiliser find_overlapping UNIQUEMENT que sur l'élément se déplaçant, donc avec les coordonnées de l'élément black.
Par contre, il faudrait voir à nommer tes variables par ce qu'elles représentent, dans ton code black est un cercle, et boule un rectangle, ce n'est pas logique, black devrait se nommer boule (ou encore bille, balle, etc.), enfin un nom informant de la nature de l'objet, boule devrait par ex. se nommer raquette.
Et je n'ai toujours pas saisi le pourquoi du random.randrange...
Canvas.find_overlapping retourne une liste d'identifiants du canevas chevauchant le quadrlatère des coordonnées spécifiées.
Donc, ce que tu dois vérifier est que parmi ces identifiants ne se trouve pas ceux de tes obstacles (cage, cage2, boule).
Tu n'as besoin d'utiliser find_overlapping UNIQUEMENT que sur l'élément se déplaçant, donc avec les coordonnées de l'élément black.
Par contre, il faudrait voir à nommer tes variables par ce qu'elles représentent, dans ton code black est un cercle, et boule un rectangle, ce n'est pas logique, black devrait se nommer boule (ou encore bille, balle, etc.), enfin un nom informant de la nature de l'objet, boule devrait par ex. se nommer raquette.
Et je n'ai toujours pas saisi le pourquoi du random.randrange...
Bonjour, c'est un code que j'ai modifié bien des fois à la base boule était une boule jaune que je fessait bouger avec les touches clavier après j'ai rajouté des balles "black" que j'ai faire apparaître au hasard et en dernier j'ai rajouté des cages mais le code je l'ai vue marcher et black rebondissait sur cage mais au lieu de l'enregistrement j'ai faire autre choses voilà mais merci de ta réponse !.
Bon ça marche merci beaucoup a tout le monde et surtout à krug pour l'attention qu'il m'a porter!!!
from tkinter import*
from random import*
from math import *
fen=Tk()
can1=Canvas(fen,height=500,width=500,bg="red")
can1.pack(side=RIGHT)
posx=200
posy=10
dx=2
dy=5
flag=0
vx=cos(1)
ms=25
score=0
x2=100
y2=100
x=1
y=1
fen.title("jeu")
rec=can1.create_rectangle(200,200,210,250,fill="yellow")
black=can1.create_oval(posx,posy,posx+30,posy+30,fill="black")
cage=can1.create_rectangle(400,200,500,210,fill="brown")
cage2=can1.create_rectangle(400,250,500,260,fill="brown")
trai_gagnant=can1.create_line(400,210,400,250,fill="green")
if trai_gagnant>black:
score+=1
def start ():
global flag,ms
if flag ==0:
flag=1
deplacement()
def stop ():
global flag,score
flag=0
score=0
print("score :",score)
def droite(event):
can1.move(rec,10,0)
def gauche(event):
can1.move(rec,-10,0)
def haut (event):
can1.move(rec,0,-10)
def bas(event):
can1.move(rec,0,10)
def deplacement ():
global dx,dy,vx,ms,x,y,x2,y2
if can1.coords(black)[3]>500 or can1.coords(black)[1]<0:
dy=-dy
if can1.coords(black)[2]>500:
dx=-dx
if can1.coords(black)[0]<0:
x,y=randrange(480),randrange(480)
can1.coords(black,x,y,x+30,y+30)
if len(can1.find_overlapping(can1.coords(black)[0],can1.coords(black)[1],can1.coords(black)[2],can1.coords(black)[3]))>1:
dx=-dx
dy=-dy
if len(can1.find_overlapping(can1.coords(cage)[0],can1.coords(cage) [1],can1.coords(cage)[2],can1.coords(cage)[3]))>1:
dx=-dx
dy=-dy
if len(can1.find_overlapping(can1.coords(cage2)[0],can1.coords(cage2) [1],can1.coords(cage2)[2],can1.coords(cage2)[3]))>1:
dy=-dy
dx=-dx
can1.move(2,dx,dy)
if flag>0:
fen.after(ms,deplacement)
b_start=Button(fen,text="start",command=start)
b_start.pack()
b_stop=Button(fen,text="stop",command=stop)
b_stop.pack(side=LEFT)
bu_quit=Button(fen,text="quit",bg="green",command=fen.destroy)
bu_quit.pack(side=BOTTOM)
fen.bind("<Right>",droite)
fen.bind("<Left>",gauche)
fen.bind("<Up>",haut)
fen.bind("<Down>",bas)
fen.mainloop()
from tkinter import*
from random import*
from math import *
fen=Tk()
can1=Canvas(fen,height=500,width=500,bg="red")
can1.pack(side=RIGHT)
posx=200
posy=10
dx=2
dy=5
flag=0
vx=cos(1)
ms=25
score=0
x2=100
y2=100
x=1
y=1
fen.title("jeu")
rec=can1.create_rectangle(200,200,210,250,fill="yellow")
black=can1.create_oval(posx,posy,posx+30,posy+30,fill="black")
cage=can1.create_rectangle(400,200,500,210,fill="brown")
cage2=can1.create_rectangle(400,250,500,260,fill="brown")
trai_gagnant=can1.create_line(400,210,400,250,fill="green")
if trai_gagnant>black:
score+=1
def start ():
global flag,ms
if flag ==0:
flag=1
deplacement()
def stop ():
global flag,score
flag=0
score=0
print("score :",score)
def droite(event):
can1.move(rec,10,0)
def gauche(event):
can1.move(rec,-10,0)
def haut (event):
can1.move(rec,0,-10)
def bas(event):
can1.move(rec,0,10)
def deplacement ():
global dx,dy,vx,ms,x,y,x2,y2
if can1.coords(black)[3]>500 or can1.coords(black)[1]<0:
dy=-dy
if can1.coords(black)[2]>500:
dx=-dx
if can1.coords(black)[0]<0:
x,y=randrange(480),randrange(480)
can1.coords(black,x,y,x+30,y+30)
if len(can1.find_overlapping(can1.coords(black)[0],can1.coords(black)[1],can1.coords(black)[2],can1.coords(black)[3]))>1:
dx=-dx
dy=-dy
if len(can1.find_overlapping(can1.coords(cage)[0],can1.coords(cage) [1],can1.coords(cage)[2],can1.coords(cage)[3]))>1:
dx=-dx
dy=-dy
if len(can1.find_overlapping(can1.coords(cage2)[0],can1.coords(cage2) [1],can1.coords(cage2)[2],can1.coords(cage2)[3]))>1:
dy=-dy
dx=-dx
can1.move(2,dx,dy)
if flag>0:
fen.after(ms,deplacement)
b_start=Button(fen,text="start",command=start)
b_start.pack()
b_stop=Button(fen,text="stop",command=stop)
b_stop.pack(side=LEFT)
bu_quit=Button(fen,text="quit",bg="green",command=fen.destroy)
bu_quit.pack(side=BOTTOM)
fen.bind("<Right>",droite)
fen.bind("<Left>",gauche)
fen.bind("<Up>",haut)
fen.bind("<Down>",bas)
fen.mainloop()
17 oct. 2019 à 21:33