CASSE BRIQUE

elnabo Messages postés 28 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 2 mai 2016 - 10 juil. 2010 à 02:13
 unknown - 9 mars 2018 à 01:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52002-casse-brique

bravo
Litisme Messages postés 9 Date d'inscription dimanche 15 mars 2015 Statut Membre Dernière intervention 16 mai 2015
22 avril 2015 à 04:30
Je pense que c'est normal Yann
Est-ce normal que lorsque je bouge la souris, la vitesse de la balle est modifiée et dépend de la vitesse de la barre ?
Si non le code tourne parfaitement bien
Litisme Messages postés 9 Date d'inscription dimanche 15 mars 2015 Statut Membre Dernière intervention 16 mai 2015
20 mars 2015 à 19:25
Le programme d'elnabo est correct mais semble rempli inutilement...
As tu trouvé un meilleur projet?
spacemax2010 Messages postés 4 Date d'inscription jeudi 23 décembre 2010 Statut Membre Dernière intervention 18 mai 2015
23 déc. 2010 à 22:33
Le clavier est moins réactif que la souris sinon çà tourne!
elnabo Messages postés 28 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 2 mai 2016
13 juil. 2010 à 12:19
Ok merci.
C'est vrai que c'est rébarbatif d'écrire tout le temps self....
prog94 Messages postés 10 Date d'inscription jeudi 23 mars 2006 Statut Membre Dernière intervention 9 janvier 2009
12 juil. 2010 à 12:10
Eh bien c'est pas très utile et ça alourdit ton code.
C'est vrai que c'est plus long d'écrire self.barre.x au lieu de self.bar mais la plupart des éditeurs de développement ont la complétion maintenant et le mieux est de choisir un nom de variable ni trop long, ni trop court et le plus explicite possible.
elnabo Messages postés 28 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 2 mai 2016
12 juil. 2010 à 11:58
Ok merci pour le commentaire.
J'vais regardé ça.

Sinon est-ce vraiment génant de mettre des variables intermediaires pour simplifier l'écriture?
prog94 Messages postés 10 Date d'inscription jeudi 23 mars 2006 Statut Membre Dernière intervention 9 janvier 2009
12 juil. 2010 à 03:55
Désolé comme t'as pu le remarqué j'ai eu un problème de copier-coller :(
prog94 Messages postés 10 Date d'inscription jeudi 23 mars 2006 Statut Membre Dernière intervention 9 janvier 2009
12 juil. 2010 à 03:53
Salut elnabo,
j'ai regardé ton code et j'ai fais quelques modifications que voici :
- j'ai créé deux nouvelles classes permettant de gérer les balles et les briques, avec pour chacune un constructeur prenant en argument commun aux deux classes une référence au canevas, une position et une taille et deux méthodes : set_position et move.
- j'ai virer le remplissage inutile de ta variable self.vie avec des chaînes vides.
- j'ai eu l'impression que tu avais créé une variable can juste pour ne pas écrire à chaque fois self.can donc j'ai remplacé ça aussi ;)
- tes briques tiennent maintenant dans un seul tableau self.lbrique, on accède au coordonnées grâce aux attributs de la classe Brique
- j'ai remplacer ton tableau de couleurs par un tuple de couleurs, comme tu ne va pas le modifier de toute façon ...
- plus besoin de la variable self.coord, les coordonnées de la boule sont dans son instance
- la barre est maintenant une instance de la classe Brique, plus besoin de self.bar
- j'ai viré la variable intermédiaire a dans la méthode souris
- dans la méthode go(), j'ai remplacer tes premières lignes par un appel à la méthode move de l'instance self.boule, j'ai virer le while pour y mettre un for avec un enumerate me permettant d'itérer sur chacune des briques et de pouvoir la supprimer du tableau self.lbrique grâce à son index.
- le fait de supprimer et de recréé le texte du score était assez moche, la méthode itemconfig du canvas permet de modifier un item du canevas sans avoir à le supprimer et recréé
- j'ai modifier la hauteur de test pour voir si la balle touche la barre pour enlever l'effet "passe au travers"
- enfin chez moi le jeu était vraiment trop rapide j'ai donc changer la vitesse de rafraîchissement du canevas de 2 à 20 pour faire mes tests.

Voici le code source modifié :

from Tkinter import *
from random import randrange
from math import cos,pi,sin

class Brique:

def __init__(self, boss, x, y, width, height, resistance, color):
self.boss = boss;
self.x = x;
self.y = y;
self.width = width;
self.height = height;
self.resistance = resistance;
self._id = boss.create_rectangle(x, y, x + width, y + height, fill=color);

def set_position(self, x, y):
self.x = x;
self.y = y;
self.boss.coords(self._id, x, y, x + self.width, y + self.height);

def move(self, x, y):
self.x += x;
self.y += y;
self.boss.coords(self._id, x, y, x + self.width, y + self.height);

def delete(self):
self.boss.delete(self._id);

class Ball:

def __init__(self, boss, x, y, size):
self.boss = boss;
self.x = x;
self.y = y;
self.size = size;
self._id = boss.create_oval(x, y, x + size, y + size, fill='red');

def set_position(self, x, y):
self.x = x;
self.y = y;
self.boss.coords(self._id, x, y, x + self.size, y + self.size);

def move(self, x, y):
self.x += x;
self.y += y;
self.boss.coords(self._id, self.x, self.y, self.x + self.size, self.y + self.size);

class Principale(Tk):
def __init__(self,parent,vie=5):

Tk.__init__(self,parent)

#Initialisation des paramètres

self.parent = parent
self.flag = 0 #Variable permettant d'empêcher/autoriser, la lancement de la balle
self.vie = []
self.score = 0

#On crée un canevas

self.can = Canvas(width=490, height = 500,bg='black')
self.can.focus()

#Initialisation des commandes
self.can.bind_all('<Key>', self.move)
self.can.bind_all('<Return>',self.starter)
self.can.bind('<Motion>',self.souris)
self.can.bind('', self.starter)
self.can.bind_all('p',self.pause)

self.can.create_rectangle(0,470,492,502,fill='light grey') #Pour les vies et le score

self.can.create_text(415,480,text='Score: ')
self.tscore = self.can.create_text(460,480,text='0')

#On crée les balles représentatives des vies
for i in range(0, 5):
self.vie.append(Ball(self.can, (25*vie)-(25*i), 493, -10));

#On initialise d'autres paramètres
self.pose = 0 #Pause On/Off
self.angle = pi/3 #Angle de rebond de la balle
self.sens = -1 #Sens Haut/Bas de la balle
self.horizon = 1 #Sens Gauche/Droite de la ballefrom Tkinter import *
from random import randrange
from math import cos,pi,sin

class Brique:

def __init__(self, boss, x, y, width, height, resistance, color):
self.boss = boss;
self.x = x;
self.y = y;
self.width = width;
self.height = height;
self.resistance = resistance;
self._id = boss.create_rectangle(x, y, x + width, y + height, fill=color);

def set_position(self, x, y):
self.x = x;
self.y = y;
self.boss.coords(self._id, x, y, x + self.width, y + self.height);

def move(self, x, y):
self.x += x;
self.y += y;
self.boss.coords(self._id, x, y, x + self.width, y + self.height);

def delete(self):
self.boss.delete(self._id);

class Ball:

def __init__(self, boss, x, y, size):
self.boss = boss;
self.x = x;
self.y = y;
self.size = size;
self._id = boss.create_oval(x, y, x + size, y + size, fill='red');

def set_position(self, x, y):
self.x = x;
self.y = y;
self.boss.coords(self._id, x, y, x + self.size, y + self.size);

def move(self, x, y):
self.x += x;
self.y += y;
self.boss.coords(self._id, self.x, self.y, self.x + self.size, self.y + self.size);

class Principale(Tk):
def __init__(self,parent,vie=5):

Tk.__init__(self,parent)

#Initialisation des paramètres

self.parent = parent
self.flag = 0 #Variable permettant d'empêcher/autoriser, la lancement de la balle
self.vie = []
self.score = 0

#On crée un canevas

self.can = Canvas(width=490, height = 500,bg='black')
self.can.focus()

#Initialisation des commandes
self.can.bind_all('<Key>', self.move)
self.can.bind_all('<Return>',self.starter)
self.can.bind('<Motion>',self.souris)
self.can.bind('', self.starter)
self.can.bind_all('p',self.pause)

self.can.create_rectangle(0,470,492,502,fill='light grey') #Pour les vies et le score

self.can.create_text(415,480,text='Score: ')
self.tscore = self.can.create_text(460,480,text='0')

#On crée les balles représentatives des vies
for i in range(0, 5):
self.vie.append(Ball(self.can, (25*vie)-(25*i), 493, -10));

#On initialise d'autres paramètres
self.pose = 0 #Pause On/Off
self.angle = pi/3 #Angle de rebond de la balle
self.sens = -1 #Sens Haut/Bas de la balle
self.horizon = 1 #Sens Gauche/Droite de la balle
self.lbrique = [] #Liste comportant les briques (pour les supprimers)

coul=('green','yellow','light blue','red','orange') #Différentes couleurs des briques
i = 1 #Permet de définir: Résistance des briques/Couleur des briques
x = 12 #Coordonnées en Abscisses
y = 40 #Coordonnées en Ordonnées

#On crée les 110 briques du jeu

while x<470:
self.lbrique.append(Brique(self.can, x, y, 40, 10, (i % 4) + 1, coul[i]));
y+=12
i = (i + 1) % 5
# i est la résistance de la brique. Si ((i%4)+1) = 3, il faudra taper 3fois la brique
if y==160:
x+=43
y = 40

#Creation de la balle
self.boule = Ball(self.can, 250, 450, 10);

#Creation de la barre(pour les rebonds)
self.barre = Brique(self.can, 235, 460, 40, 5, 0, 'light green')

self.can.pack()

def starter(self,event): #Fonction qui démarre les balles
if self.flag == 0 and len(self.vie)!=0:
self.go()
self.flag = 1

def pause(self,event): #Fonction qui met en pause le jeu
self.pose+=1
self.pose = self.pose%2
if self.pose==0:
self.go()
self.can.delete(self.text)
else:
self.text = self.can.create_text(250,250,text='PAUSE',fill='white')

def souris(self,event): #Permet de déplacer la barre avec la Souris
if 5 < event.x < 455 and not self.pose:
self.barre.set_position(event.x, 460);

def move(self,event): #Permet de déplacer la barre avec le Clavier
a = event.keysym
if a == 'Left':
self.direction = -7
if a == 'Right':
self.direction = 7

if a!='Return' and a!='':
a = self.barre.x + self.direction;
if 5 < a < 455 and self.pose == 0:
self.barre.set_position(a, 460);
else:
self.barre.x -= self.direction;

def go(self): #Fonction principale, déplace la balle

stop = 0

#On modifie les coordonnées de la balle en fonction des précedentes
self.boule.move(cos(self.angle) * self.horizon, sin(self.angle) * self.sens * 5);

for i, brique in enumerate(self.lbrique):
#On vérifie si elles sont en contact avec la balle
if brique.y - 2 <= self.boule.y <= brique.y + 12 and brique.x - 2 <= self.boule.x <= brique.x + 42:
#Si oui on change de direction
self.sens = (-1)*self.sens
brique.resistance -= 1
if not brique.resistance: #Si la brique ne peut plus tenir
#On la détruit et on augmente le score
brique.delete()
self.score += 20 * (len(self.vie))

self.can.itemconfig(self.tscore, text=str(self.score));

del self.lbrique[i]
if not self.lbrique:
#Si il n'y a plus de brique on arrête la balle
stop = 1
break

#Si la balle tape la barre
if 450 <= self.boule.y <= 455 and self.barre.x - 10 < self.boule.x < self.barre.x + 47:
#Si c'est sur le coin gauche, un angle plus grand
if self.barre.x-10 <= self.boule.x <= self.barre.x+5:
self.angle = 2*pi/3
self.horizon = 5

#Si c'est sur le coin droit, un angle plus petit
elif self.barre.x+37 <= self.boule.x <= self.barre.x+47:
self.angle = pi/5
self.horizon = 5

#Sinon l'angle sera dans l'autre sens
else:
self.angle = pi/3

self.sens = (-1) * self.sens

if self.boule.x < 10 or self.boule.x > 478: #Si on tape sur le bord gauche/droit
self.horizon = (-1)*self.horizon

if self.boule.y < 10: #Si on tape le plafond
self.sens = (-1)*self.sens

if self.boule.y > 466 and self.boule.x > self.barre.x + 47 or self.boule.y > 466 and self.boule.x < self.barre.x - 10:
#Si on tombe à coté de la barre, on perd une vie
self.can.delete(self.vie[0])
del self.vie[0]
stop = 1

if stop == 1: #Si on a perdu une balle,ou gagné, on remet la balle à sa place
self.flag=0
self.sens = (-1)*self.sens
self.boule.set_position(250, 440);
self.barre.set_position(235,460);

if len(self.vie)==0: #Si on a plus de vie, on écrit 'perdu'#
self.can.create_text(250,250,text='PERDU',fill='white')

if stop ==0 and self.pose==0: #Si on a pas perdu la balle, on recommence
self.can.after(20,self.go)

app = Principale(None) ###On lance l'application
app.mainloop()

Sinon ton code est assez sympa et bien commenté, continue comme ça ;)
elnabo Messages postés 28 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 2 mai 2016
10 juil. 2010 à 02:13
Damn, 9 personnes ont téléchargés. Pourrais-je avoir des commentaires svp?
Rejoignez-nous