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 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
| # ======================== Jeux de balles - début de codage le 10/02/2024 - terminé le 17/02/2024 =================================
# importe les modules
from tkinter import *
from random import *
# ================================================== définition des fonctions =====================================================
# === affiche la règle du jeu ===
def regleJeu():
texteRegle = "Plusieurs balles de couleurs différentes se déplacent au hasard sur le canevas\n\
à vitesse faible, rebondissent les unes sur les autres et sur les paroies. Le joueur doit\n\
cliquer sur la balle actuellement Bleue. S'il y arrive, il gagne un point, mais la balle se\n\
déplace désormais un peu plus vite, elle devient plus petite et change de couleur. Si le\n\
joueur se trompe de balle il perds 1 points. Le jeux s'arrête après 15 clics et affiche le\n\
score atteint."
message = Toplevel(fenetre)
message.geometry("475x110")
message.title("Règle du jeu")
Label(message, text= texteRegle, ).place(x=5,y=5)
# === déplacements des 3 balles ===
def boucleDeplacements():
global x1Balle1, y1Balle1, dxBalle1, dyBalle1, x1Balle2, y1Balle2, dxBalle2, dyBalle2, x1Balle3,\
y1Balle3, dxBalle3, dyBalle3, vBalles, tBalles, nbrClics, flagClic,countCoul1, countCoul2, countCoul3
boutonRegles['state'] = DISABLED # statut des boutons
boutonLancer['state'] = DISABLED
# déplacement de la balle 1
x1Balle1, y1Balle1 = x1Balle1 + dxBalle1, y1Balle1 + dyBalle1
if len(canevas.find_overlapping(x1Balle1, y1Balle1, x1Balle1 + tBalles, y1Balle1 + tBalles)) > 1 : # rebond sur une autre balle
x1Balle1, dxBalle1, dyBalle1 = 270, randint(10, 15), randint(10, 15)
if x1Balle1 >270: # rebond sur le bord droit
x1Balle1, dxBalle1, dyBalle1 = 270, -randint(10, 15), randint(10, 15)
if y1Balle1 >270: # rebond sur le bord bas
y1Balle1, dxBalle1, dyBalle1 = 270, -randint(10, 15), -randint(10, 15)
if x1Balle1 <2: # rebond sur le bord gauche
x1Balle1, dxBalle1, dyBalle1 = 2, randint(10, 15), -randint(10, 15)
if y1Balle1 <2: # rebond sur le bord haut
y1Balle1, dxBalle1, dyBalle1 = 2, randint(10, 15), randint(10, 15)
canevas.coords(balle1, x1Balle1, y1Balle1, x1Balle1 + tBalles, y1Balle1 + tBalles)
# déplacement de la balle 2
x1Balle2, y1Balle2 = x1Balle2 +dxBalle2, y1Balle2 +dyBalle2
if len(canevas.find_overlapping(x1Balle2, y1Balle2, x1Balle2 + tBalles, y1Balle2 + tBalles)) > 1 : # rebond sur une autre balle
x1Balle2, dxBalle2, dyBalle2 = 270, randint(10, 15), randint(10, 15)
if x1Balle2 >270: # rebond sur le bord droit
x1Balle2, dxBalle2, dyBalle2 = 270, -randint(10, 15), randint(10, 15)
if y1Balle2 >270: # rebond sur le bord bas
y1Balle2, dxBalle2, dyBalle2 = 270, -randint(10, 15), -randint(10, 15)
if x1Balle2 <2: # rebond sur le bord gauche
x1Balle2, dxBalle2, dyBalle2 = 2, randint(10, 15), -randint(10, 15)
if y1Balle2 <2: # rebond sur le bord haut
y1Balle2, dxBalle2, dyBalle2 = 2, randint(10, 15), randint(10, 15)
canevas.coords(balle2, x1Balle2, y1Balle2, x1Balle2 + tBalles, y1Balle2 + tBalles)
# déplacement de la balle 3
x1Balle3, y1Balle3 = x1Balle3 +dxBalle3, y1Balle3 +dyBalle3
if len(canevas.find_overlapping(x1Balle3, y1Balle3, x1Balle3 + tBalles, y1Balle3 + tBalles)) > 1 : # rebond sur une autre balle
x1Balle3, dxBalle3, dyBalle3 = 270, randint(10, 15), randint(10, 15)
if x1Balle3 >270: # rebond sur le bord droit
x1Balle3, dxBalle3, dyBalle3 = 270, -randint(10, 15), randint(10, 15)
if y1Balle3 >270: # rebond sur le bord bas
y1Balle3, dxBalle3, dyBalle3 = 270, -randint(10, 15), -randint(10, 15)
if x1Balle3 <2: # rebond sur le bord gauche
x1Balle3, dxBalle3, dyBalle3 = 2, randint(10, 15), -randint(10, 15)
if y1Balle3 <2: # rebond sur le bord haut
y1Balle3, dxBalle3, dyBalle3 = 2, randint(10, 15), randint(10, 15)
canevas.coords(balle3, x1Balle3, y1Balle3, x1Balle3 + tBalles, y1Balle3 + tBalles)
if nbrClics < 15 : # tests pour terminer le déplacement des 3 balles
fenetre.after(vBalles,boucleDeplacements) # multiples exécutions ralenties de la boucle de déplacement
else :
tBalles = 30 # taille initiale des 3 balles
countCoul1, countCoul2, countCoul3 = 0, 1, 2 # compteurs des couleurs des 3 balles
canevas.itemconfigure(balle1, fill = tablCoul[countCoul1])
canevas.itemconfigure(balle2, fill = tablCoul[countCoul2])
canevas.itemconfigure(balle3, fill = tablCoul[countCoul3])
x1Balle1, y1Balle1 = 150, 120 # coordonnées initiales de la balle 1 (initialement bleue)
x1Balle2, y1Balle2 = 170, 150 # coordonnées initiales de la balle 2 (initialement jaune)
x1Balle3, y1Balle3 = 130, 150 # coordonnées initiales de la balle 3 (initialement verte)
canevas.coords(balle1, x1Balle1, y1Balle1, x1Balle1 + tBalles, y1Balle1 + tBalles) # repositionne les 3 balles
canevas.coords(balle2, x1Balle2, y1Balle2, x1Balle2 + tBalles, y1Balle2 + tBalles)
canevas.coords(balle3, x1Balle3, y1Balle3, x1Balle3 + tBalles, y1Balle3 + tBalles)
flagClic = 0 # bloque le clic de sousis avant la relance des balles
boutonRegles['state'] = NORMAL # statut des boutons
boutonLancer['state'] = NORMAL
# === fait tourner les couleurs des 3 balles ===
def changeCouleur() :
global countCoul1, countCoul2, countCoul3
if countCoul1 < 2 : countCoul1 = countCoul1 + 1
else : countCoul1 = 0
if countCoul2 < 2 : countCoul2 = countCoul2 + 1
else : countCoul2 = 0
if countCoul3 < 2 : countCoul3 = countCoul3 + 1
else : countCoul3 = 0
canevas.itemconfigure(balle1, fill = tablCoul[countCoul1])
canevas.itemconfigure(balle2, fill = tablCoul[countCoul2])
canevas.itemconfigure(balle3, fill = tablCoul[countCoul3])
# =========================================== définition des gestionnaires d'événements ===========================================
# === lance les balles ===
def lanceBalles():
global flagClic, tBalles, vBalles, nbrClics, nbrClicsMax, bonClics
nbrClics, nbrClicsMax, bonClics = 0, 15, 0 # initialise les clics
flagClic = 1 # pour permettre le clic dans le canvas
vBalles = 300 # vitesse initiale de délacement des 3 balles
labelScore.configure(text = 'Score ' + str(bonClics) + '/' + str(nbrClics)) # affiche le score
boucleDeplacements() # lance la boucle infinie de déplacements des 3 balles
# === clic bouton gauche de la souris sur les balles ===
def clicSouris(event) :
global tBalles, vBalles, x1Balle1, y1Balle1, flagClic, nbrClics, bonClics, affScore
if flagClic == 1 : # clic autorisé si les 3 balles sont lancées
nbrClics = nbrClics + 1 # compte le nombre de clics global
if x1Balle1 < event.x and event.x < x1Balle1 + tBalles : # clic sur la surface de la balle 1 (initialement bleue)
if y1Balle1 < event.y and event.y < y1Balle1 + tBalles :
tBalles = tBalles - 1
vBalles = vBalles - 30
fenetre.bell() # emet un son à chaques bons clics
bonClics = bonClics + 1
changeCouleur()
if x1Balle2 < event.x and event.x < x1Balle2 + tBalles : # clic sur la surface de la balle 2
if y1Balle2 < event.y and event.y < y1Balle2 + tBalles :
bonClics = bonClics - 1
if x1Balle3 < event.x and event.x < x1Balle3 + tBalles : # clic sur la surface de la balle 3
if y1Balle3 < event.y and event.y < y1Balle3 + tBalles :
bonClics = bonClics - 1
labelScore.configure(text = 'Score ' + str(bonClics) + '/' + str(nbrClics)) # affiche le score
# ======================================================= Programme principal =====================================================
tablCoul = ['blue', 'yellow','green'] # tableau des couleurs pour les 3 balles
countCoul1, countCoul2, countCoul3 = 1, 2, 0 # compteurs des couleurs des 3 balles
flagClic = 0 # commutateur pour ignorer le clic de souris dans le canevas
nbrClics, nbrClicsMax, bonClics = 0, 15, 0 # initialise les clics de souris
affScore = '' # initialise l'affichage du score
dxBalle1, dyBalle1 = 5, -10 # direction de déplacement initial de la balle 1
dxBalle2, dyBalle2 = -5, 5 # direction de déplacement initial de la balle 2
dxBalle3, dyBalle3 = 10, -5 # direction de déplacement initial de la balle 3
tBalles = 30 # taille initiale des balles
vBalles = 300 # vitesse initiale de délacement des balles
x1Balle1, y1Balle1 = 150, 120 # coordonnées initiales de la balle 1 (initialement bleue)
x1Balle2, y1Balle2 = 170, 150 # coordonnées initiales de la balle 2 (initialement jaune)
x1Balle3, y1Balle3 = 130, 150 # coordonnées initiales de la balle 3 (initialement verte)
# === création du widget racine ===
fenetre = Tk()
fenetre.title("Jeu de balles - Cliquez sur la balle bleue")
# === création des widgets enfants ===
canevas = Canvas(fenetre,bg='dark grey',height=300, width=300)
canevas.pack(side=LEFT)
canevas.bind('<Button-1>', clicSouris) # détection du clic bouton gauche de la souris dans le canevas
balle1 = canevas.create_oval(x1Balle1, y1Balle1, x1Balle1+tBalles, y1Balle1+tBalles, width=1, fill=tablCoul[0])
balle2 = canevas.create_oval(x1Balle2, y1Balle2, x1Balle2+tBalles, y1Balle2+tBalles, width=1, fill=tablCoul[1])
balle3 = canevas.create_oval(x1Balle3, y1Balle3, x1Balle3+tBalles, y1Balle3+tBalles, width=1, fill=tablCoul[2])
boutonQuitter = Button(fenetre,text='Quitter', width = 13, command=fenetre.quit)
boutonQuitter.pack(side=BOTTOM)
boutonRegles = Button(fenetre, text='Règle du jeu', width = 13, command=regleJeu)
boutonRegles.pack()
boutonLancer = Button(fenetre, text='Lancez les balles', width = 13, command=lanceBalles)
boutonLancer.pack()
labelScore = Label(fenetre, textvariable=affScore)
labelScore.pack()
# =========================================== démarrage du réceptionnaire d'événements ============================================
fenetre.mainloop() |
Partager