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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
from tkinter import * #Le programme va aller chercher toute les fonctions de la bibliothèque Tkinter
import math,random #Le programme va aller chercher toute les fonctions de la bibliotèque math
from math import cos,pi,sin
fenetre= Tk()
fenetre.title("Casse briques")
def Clavier(event):
""" Gestion de l'événement Appui sur une touche du clavier """
global x1,x2,raquette,vitesse
touche = event.keysym
# déplacement vers la droite
Can1.delete(raquette)
if touche == 'Right' and x2<=549:
x1 += 13.5333333333
x2 += 13.5333333333
# déplacement vers la gauche
if touche == 'Left' and x1>=0.4:
x1 -= 13.5333333333
x2 -= 13.5333333333
#On donne les nouvelles coordonnées à la raquette
Can1.coords(Rectangle1,x1,y1,x2,y2)
raquette=Can1.create_image(x1+72,y1-15,image=RAQUETTE)
def quitter (event):#Pour quitter le programme
fenetre.destroy()
def pleinecran (event):
w, h = fenetre.winfo_screenwidth(), fenetre.winfo_screenheight()
fenetre.overrideredirect(1)
fenetre.geometry("%dx%d+0+0" % (w, h))
fenetre.mainloop()
def deplacement():
""" Déplacement de la balle """
global X,Y,DX,DY,RAYON,LARGEUR,HAUTEUR,FLAG,x1,x2,y1,y2,vitesse,cible2
Can1.delete(cible2)
# rebond à droite
if X+RAYON+DX > LARGEUR:
X = 2*(LARGEUR-RAYON)-X
DX = -DX
# rebond à gauche
if X-RAYON+DX < 0:
X = 2*RAYON-X
DX = -DX
# rebond en bas
if Y+RAYON+DY > HAUTEUR:
Y = 2*(HAUTEUR-RAYON)-Y
DY = -DY
# rebond en haut
if Y-RAYON+DY < 0:
Y = 2*RAYON-Y
DY = -DY
X = X+DX
Y = Y+DY
#Si la balle tape la barre
if Y+RAYON >= y2 and x1 <= X <= x2 :
DY = -DY
#x1 le côté gauche de la raquette et x2 le côté droit
#Angle que prend la balle sur le côté gauche de la raquette
if x1-1 < X < x1+20: # "X" est la coordonnées de la balle
DX = vitesse*math.cos(5*pi/6)
if x1+20 < X < x1+42:
DX = vitesse*math.cos(3*pi/4)
if x1+42 < X < x1+63:
DX = vitesse*math.cos(2*pi/3)
if x1+63 < X < x1+68:
DX = vitesse*math.cos(7*pi/12)
#Angle que prend la balle sur le côté droit de la raquette
if x2-68 < X < x2-63:
DX = vitesse*math.cos(5*pi/12)
if x2-63 < X < x2-42:
DX = vitesse*math.cos(pi/3)
if x2-42 < X < x2-20:
DX = vitesse*math.cos(pi/4)
if x2-20 < X < x2+1:
DX = vitesse*math.cos(pi/6)
#Ici l'angle prend un angle droit à cause de cos de pi/2
if x1+68 < X < x1+88:
DX = vitesse*math.cos(pi/2)
#Faire le rebond si les côtés de la raquette
#Sur le côté gauche
if Y >= y2 and x1+RAYON >= X+RAYON >= x1:
X = 2*(LARGEUR-RAYON)-X
if Y >= y2 and x2-RAYON <= X-RAYON <= x2:
X = 2*(LARGEUR-RAYON)-X
# affichage
Can1.coords(Balle,X-RAYON,Y-RAYON,X+RAYON,Y+RAYON)
if FLAG >0:
fenetre.after(10,deplacement) # mise à jour toutes les 50 ms
cible2=Can1.create_image(X,Y,image=dbz)
def stop():
"arret de l'animation"
global FLAG
FLAG =0
def start(event): #On met event pour pouvoir executer la fonction grâce à la toucher entrer
# demarrage de l'animation
global FLAG,instructions
del instructions #On enlève l'image instructions en optimisant la mémoire
if FLAG ==0: #pour ne lancer quune seule boucle
FLAG =1
deplacement()
def effacer(event):
del instructions
#DEBUT DU PROGRAMME###########################
Can1 = Canvas(fenetre, width=550, height=600, highlightthickness=0)#On définit la taille de la fenêtre de jeu grace au canvas
Can1.pack()#Et on n'oublie pas le .pack() pour l'afficher
#highlightthickness=0 Permet d'enlever les bordures dû au "focus" pour
#que le programme reconnaisse les touches
LARGEUR =550 #Largeur de la fenêtre
HAUTEUR = 700 #Hauteur de la fenêtre
FLAG= 0
x1 = ((1/3)*LARGEUR)+20 #Côté gauche du rectangle
y1 = 590 #Deuxième valeur de la hauteur
x2 = ((2/3)*LARGEUR)-20 #Côté droit du rectangle
y2 = 560 #Première valeur de la hauteur
#En définissant la largeur du rectangle de cette façon on obtient une largeur égale à 1/3 de l'écran
#Et au milieu de l'écran.Ensuite on enlève 20 d'abscisse de chaque côté pour
#Raccourcir la barre trop longue à mon goût
Rectangle1 = Can1.create_rectangle(x1,y1,x2,y2,fill='blue')
#Créer les fonctions pour faire bouger le rectangle:
#Pour que le canvas capture les événement clavier, il faut qu'il soit sélectionner
#(Qu'il est le focus), donc on le sélectionne grâce à cette commande qui lui donne
#Ces contours gris
RAQUETTE= PhotoImage(file='RAQUETTE.gif')
raquette=Can1.create_image(x1+72,y1-15,image=RAQUETTE)
Can1.focus_set()
Can1.bind('<Key>',Clavier)
#Coordonnées de la balles
RAYON = 10 # rayon de la balle
X = LARGEUR/2 #
Y = 535 #Pour la mettre au dessus de la raquette qui est à 560pixels
# direction initiale aléatoire de la balle
angle = random.uniform(0,2*math.pi)
vitesse = random.uniform(1.8,2)*5 #Vitesse de la balle
DX = vitesse*math.cos(2/pi) #Vitesse et angle de la balle en abscisse
DY = vitesse*math.sin(angle) #Vitesse et angle de la balle en ordonnée
dbz= PhotoImage (file='BALLE.gif')
# Création de la balle
Balle = Can1.create_oval(X-RAYON,Y-RAYON,X+RAYON,Y+RAYON,width=1,fill='green')
cible2=Can1.create_image(X,Y,image=dbz)
# Instructions
instructions= PhotoImage(file='instructions.gif')
cible=Can1.create_image(275,250,image=instructions)
Can1.bind("<Return>",start)
Can1.bind("<Escape>",quitter)
Can1.bind("<f>",pleinecran)
Can1.bind("<F>",pleinecran)
Can1.pack()
fenetre.mainloop() |