Soyez le premier à donner votre avis sur cette source.
Vue 4 536 fois - Téléchargée 407 fois
import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.Event; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.Random; // réalisé par fats //si vous souhaitez contribuez à l'amelioration de ce casse brique : fate12346@gmail.com public class toto extends Applet implements Runnable { public static int direction ; // direction est/ouest (1 vers la droite -1 vers la gauche) public static int directionns ; // direction nord sud public static int niveau ; public static int nbbrique ; public static int nbbriquejeu ; public static int vie = 3; public static boolean encour = true; public static boolean perdu = false; public static boolean expansion = false; public static boolean tetebrule = false; public static boolean diminution = false; public static boolean pause = false; int x_pos = 50; // position de la balle int y_pos = 160; int radius = 5; // rayon de la balle int hauteur = 5; // dimension de la raquette int largeur = 40;// int dureté ; int longueurb = 25; // dimension brique int hauteurb = 15; int possx = 50; // position de la raquette int possy = 170; int outgauche = 2; int outdroit= 300; int outhaut= 0; int vitx = 2; // vitesse int vity = 2; int score ; int valeur=0; boolean changer = false; boolean test ; Point[] brique = new Point[30]; int tabcolor [] = new int [30]; int tabdurete [] = new int [30]; Reaction reaction [] = new Reaction [30] ; Image Image; Graphics d; public void init() { direction = 1; directionns = -1; dureté = 1; niveau = 1; score = 0; changer = false; setBackground (Color.black); chargerniveau(niveau); } public void start () { Thread th = new Thread (this); th.start (); } public void run () { while (!(perdu)&& !(encour) ) { if (!pause){ move(); collisionraquette (); collisionmur(); collisionbrique(); if (nbbrique <= 0 ){ niveau++; encour = true; chargerniveau(niveau); if (niveau>3) {perdu = true;} } repaint(); try { Thread.sleep (15); } catch (InterruptedException ex) { } Thread.currentThread().setPriority(Thread.MAX_PRIORITY); }// fin if }// fin while } // fin run() public void paint (Graphics g) { if (niveau<4){ // on affiche le menu de presentation if(encour==true ){ g.setColor (Color.WHITE); g.setFont(new Font("Arial",Font.BOLD,14)); g.drawString("BREAK GAME",80,140); g.drawString("START -> ENTER",310,140); if (changer==true){ // a chaque changement de niveau on affiche le nouveau niveau g.setFont(new Font("Arial",Font.BOLD,13)); g.drawString("NIVEAU " + niveau,100,157); }}} for (int i = 0; i<nbbriquejeu; i++) // on dessine les briques { if (brique[i].x >0 && brique[i].y >0) switch(tabcolor[i]){ case 1: g.setColor (Color.magenta); break; case 2: g.setColor (Color.blue); break; case 3: g.setColor (Color.yellow); break; case 0 : g.setColor (Color.green); break; } g.fillRoundRect(brique[i].x,brique[i].y, longueurb,hauteurb,3,3); } if (expansion){ // on affiche le bonus expansion g.setFont(new Font("Arial",Font.BOLD,12)); g.setColor (Color.WHITE); g.drawString("EXPANSION", 310,55 ); } if (tetebrule){ // la balle change de couleur quand le bonus tetebrule a été recuperer if (test == true){ // on affiche le bonus g.setFont(new Font("Arial",Font.BOLD,12)); g.setColor (Color.ORANGE); g.drawString("TETE BRULE", 310, 70); } g.setColor (Color.orange); g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); // la balle devient orange } else { g.setColor (Color.green); g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); // la balle devient verte } if (diminution){ g.setFont(new Font("Arial",Font.BOLD,12)); g.setColor (Color.cyan); g.drawString("DIMINUTION", 310, 85); } g.setColor (Color.gray); // on dessine les informations nécessaires au joueur g.drawRect(outdroit,0,2,190); g.setFont(new Font("Arial",Font.BOLD,12)); g.setColor (Color.yellow); g.drawString("Score : "+ score, 310, 20); g.setColor (Color.red); g.drawString("Vie : "+ vie, 310, 35); if (pause && !(perdu)){ // si le jeu est en pause mais n'est pas terminé g.setFont(new Font("Arial",Font.BOLD,14)); g.setColor (Color.white); g.drawString("REJOUER !", 85, 145); } if((perdu)){ g.setFont(new Font("Arial",Font.BOLD,14)); g.setColor (Color.WHITE); g.drawString("GAME OVER",85,140); g.drawString("SCORE : "+ score, 85, 157); } g.setColor(Color.red); g.fillRoundRect(possx,170,largeur,hauteur,2,2); } // fin paint() public void update (Graphics g) { Image = createImage (this.getSize().width, this.getSize().height); d = Image.getGraphics (); paint (d); g.drawImage (Image, 0, 0, this); } public boolean mouseMove(Event evt, int x, int y) { possx=x; repaint(); return true;} public boolean keyDown(Event evt, int key) { // recupere une valeur pour afficher le titre du jeu if( key ==Event.ENTER){ if (!perdu && encour ){ encour= false; perdu = false; changer=false; System.out.println("jk"); start(); } pause = false; return true; } return false; } public void stopmove(){ if (vie>=0){ pause = true; vitx=2; x_pos= possx+radius ; // on met a jour la position de la balle y_pos = possy-(radius*2); }else{ perdu=true; // game over et on met vie à 0 pour éviter d'etre a -1 vie = 0; } } public void move (){ x_pos= x_pos+vitx; y_pos = y_pos+vity; } public void move (int dx , int dy){ // methode de changement de direction de la balle vitx = dx; vity=dy; if (vitx <0){ direction =-1; } else{ direction=1; } if (vity <0){ directionns =-1; } else{ directionns=1; } } public void collisionmur(){ if((x_pos<outgauche ) || (x_pos>outdroit ) ){ // X collisions move(-vitx,vity); } if (y_pos<outhaut ){ // Y collisions move(vitx,-vity); } if ((y_pos+radius) > (possy + hauteur)+5) { vie--; stopmove(); } } public void collisionraquette (){ if ((y_pos>=possy-2 && y_pos<=possy+1)&&(x_pos >= possx && x_pos<= possx+largeur+1)) // milieu de la raquette { y_pos= possy - 10; score += 2; move(vitx,-vity); } if (y_pos>possy-3 && y_pos<=possy+3){ //coin droit de la barre if (x_pos > possx+(largeur+1) && x_pos< possx+largeur+9){ score += 2; x_pos= x_pos+10; if (direction==-1){ x_pos= x_pos+5; y_pos= possy - 10; move(-vitx,-vity);} else{ move(vitx,-vity); } } } if (y_pos>possy-1 && y_pos<=possy+4){ //coin gauche de la barre if(x_pos < possx+1 && x_pos> possx-9){ score += 2; if (direction==1){ y_pos= possy - 17; x_pos= x_pos-10; move(-vitx,-vity); } else{ move(vitx,-vity); } } } } public void diminution(){ largeur=25; expansion = false; diminution = true; } public void expansion (){ // la longueur de la raquette augmente if(largeur==40 && expansion == false){ largeur+=20; expansion = true; }else{ largeur = 60; // on n'augmmente pas plus de 60 si la expansion() est appelé plusieurs fois expansion=true; } diminution = false; } public void taillenormal (){ expansion = false; diminution = false; largeur = 40; } public void tetebrule (){ // la balle brule toute les briques for( int i = 0 ; i <nbbriquejeu;i++){ tabdurete[i]=0; } test = true; tetebrule = true; } public void nbcoup (int parametre, int indice){ if (parametre==1){ nbbrique--; direction = -direction; move(-vitx, -vity); tabdurete[indice]= parametre-1; brique[indice].move(-25, 0); } if (parametre==2){ direction = -direction; move(-vitx, -vity); tabdurete[indice]= parametre-1; tabcolor[indice] = tabdurete[indice]; } if (parametre==3){ direction = -direction; move(-vitx, -vity); tabdurete[indice]= parametre-1; tabcolor[indice] = tabdurete[indice]; } if ((parametre==0)){ nbbrique --; brique[indice].move(-25, 0); tabdurete[indice]=0; move(vitx, vity); } } public void reagir (int indice){ int dur = tabdurete[indice]; if (reaction[indice].expansion){ expansion(); } if (reaction[indice].tetebrule){ tetebrule(); } if (reaction[indice].taillenormal){ taillenormal(); } if (reaction[indice].diminution){ diminution(); } nbcoup(dur,indice); score = score+10; } public void collisionbrique(){ for (int i = 0; i< nbbriquejeu; i++){ if ((brique[i].x > -25 && brique[i].y>0) ){ if(x_pos-3>brique[i].x-2 && x_pos-3 <brique[i].x+(longueurb+1) ){ if(y_pos-3< brique[i].y+(hauteurb+1) && y_pos-3 >brique[i].y-1 ){ reagir (i); } } if((y_pos+radius+3> brique[i].y-1 && y_pos+radius+3 <brique[i].y+(hauteurb+1) ) ){ if(x_pos+radius> brique[i].x-2 && x_pos+radius <brique[i].x+(longueurb+1) ){ reagir (i); } } } } // fin for } // fin collisionbrique public void chargerniveau (int n){ // niveau de jeu int p ; int k ; int z; largeur = 40; diminution = false; expansion = false; tetebrule = false; x_pos= possx+radius ; // on met a jour la position de la balle y_pos = possy-(radius*2); nbbrique = 28; nbbriquejeu = nbbrique; //------------------------------------------NIVEAU 1--------------------------------------------------- if (n==1){ changer = true; nbbrique = 28; nbbriquejeu = nbbrique; p = 0; k =0; for(int i=1; i<8; i++){ k+=5; for (int j=1; j<5; j++) { brique[p] = new Point((i*35)-k,(j*25)-10); reaction[p] = new Reaction(); Random r = new Random(); valeur = r.nextInt(4); tabcolor[p]= valeur; tabdurete[p] = valeur; p++; } } for (int i=0; i<=2; i++){ Random r = new Random(); valeur = r.nextInt(nbbrique); reaction[valeur].expansion = true; valeur = r.nextInt(nbbrique); reaction[valeur].taillenormal = true; } Random r = new Random(); valeur = r.nextInt(20); reaction[valeur].tetebrule = true; } // fin if //--------------------------------------NIVEAU 2-------------------------------------------- if (n==2){ changer = true; nbbrique = 27; // mise à jour du nombre de briques nbbriquejeu = nbbrique; x_pos= possx+radius ; // on met a jour la position de la balle y_pos = possy-(radius*2); p = 0; k=0; z=0; for(int i=1; i<10; i++){ k+=7; for (int j=1; j<4; j++) { brique[p].move((i*35)-k,(j*25)-10); reaction[p].reinit(); // on réinitialise tous les objets reaction Random r = new Random(); valeur = r.nextInt(4); tabcolor[p]= valeur; tabdurete[p] = valeur; p++; }} for (int i=0; i< 3; i++){ Random r = new Random(); valeur = r.nextInt(nbbrique); reaction[valeur].expansion = true; } Random r = new Random(); valeur = r.nextInt(nbbrique); reaction[valeur].tetebrule = true; valeur = r.nextInt(nbbrique); reaction[valeur].diminution = true; } // fin if //-----------------------------------NIVEAU 3-------------------------------------------- if (n==3){ changer = true; nbbrique = 25; // mise à jour du nombre de briques nbbriquejeu = nbbrique; x_pos= possx+radius ; // on met a jour la position de la balle y_pos = possy-(radius*2); p = 0; k=0; z=0; for (int j=0; j<28; j++) { reaction[j].reinit(); // on réinitialise tous les objets reaction Random r = new Random(); valeur = r.nextInt(4); tabcolor[j]= valeur; tabdurete[j] = valeur; } for (int i=0; i< 1; i++){ Random r = new Random(); valeur = r.nextInt(nbbrique); reaction[valeur].expansion = true; for(int j=0; j<2; j++){ valeur = r.nextInt(nbbrique); reaction[valeur].diminution = true; valeur = r.nextInt(nbbrique); reaction[valeur].taillenormal = true; }} int nbligne = 0; int ligne = 9 ; int espace = 15; int nbdessin = 9; for(nbligne =0; nbligne < 5;nbligne++){ // dessine un triangle de brique a l'envers k = espace; // nouvelle position x du dessin enregistrer dans k for (ligne = 0 ; ligne < nbdessin ; ligne++){ brique[p].move(k, z+10); p++; k+=30; } espace+=30; z+= 18; nbdessin-=2; } } } // fin chargerniveau() public class Reaction { boolean normal = false ; boolean expansion = false ; boolean diminution = false; boolean taillenormal = false; boolean tetebrule = false ; public void reinit (){ normal = false ; expansion = false ; diminution = false; taillenormal = false; tetebrule = false ; } } }// fin Classe toto (jeu)
16 juil. 2011 à 20:36
C'est assez indigeste comme code avec pas mal de maladresses : redondances, conception objet totalement inexistante...
Je regarderai ce code plus en détail dans la semaine et je te dirai précisément comment l'améliorer si ca t'intéresse.
Julien
16 juil. 2011 à 21:23
oui je suis tout à fait d'accord avec toi.J'ai tenter de développer ce type de casse brique en
conception objet mais j'ai buté sur les collisions des briques avec la balle d'ailleurs la source est présente sur le site.Mais bon j'ai tout de même essayer de faire le plus de fonctions possibles pour faciliter la lecture du code.
En tout cas merci d'y avoir jeté un oeil et ça m'interesserais bien sûr que tu me dise comment
l'améliorer.
20 juil. 2011 à 14:01
Alors, je vais te dire beaucoup de choses négatives sur ton code, le but est de te faire progresser, et ce que tu as posté n'est pas mauvais mais on peut faire mieux.
Tu ne respectes pas les conventions de nommage en Java. Le site d'oracle les liste pour les principales :
- Les noms de classes commencent par des majuscules et sont écrit en minuscules, les mots sont séparés par des majuscules. Exemple ClasseExemple
- Les variables sont écrites en minuscules et les mots sont séparés par des majuscules. Exemple variableExemple
- Les { s'ouvrent sur la ligne courante
Les noms des classes et des variables doivent avoir un sens. Appeler ta classe toto est une mauvaise idée.
Tu peux éviter les commentaires du type //Fin truc..., on le voit que c'est une fin de bloc, pas besoin de le dire (c'est assez courant comme maladresse)
Ton code n'est pas factorisé, il ne faut pas que des suites d'instructions soient écrites plusieurs fois, sinon, tu auras des problèmes pour la mise à jour. Par exmple
# Random r = new Random();
# valeur = r.nextInt(4);
# tabcolor[p]= valeur;
# tabdurete[p] = valeur;
Est dupliquée à plusieurs endroits de ton code, créé une fonction qui le fera et appelles là ou tu en auras besoin
De manière générale, essaye de réduire la taille de ton code les commentaires inutiles comme//--------------------------------------NIVEAU 2-------------------------------------------- prennent de la place et n'apportent rien.
Les duplication de code prennent de la place et n'apportent rien, les { ouvrants sur une nouvelle ligne idem Les sauts de ligne entre les instructions idem. On ne saute des lignes qu'entre les fonctions.
Essayes de rendre ton code plus modulaire, de créer beaucoup de petites fonctions simples plutot que quelques fonctions énormes.
20 juil. 2011 à 14:04
Tu peux aussi faire des fonction jouerNiveau1 et jouerNiveau2...
20 juil. 2011 à 23:10
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.