Break game

Soyez le premier à donner votre avis sur cette source.

Vue 4 536 fois - Téléchargée 407 fois

Description

Bonjour, voici un petit casse brique très simple mais fonctionnel en programmation structurée avec trois niveaux.

Source / Exemple :

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)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 369
16 juil. 2011 à 20:36
Bonjour,

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
fate123 Messages postés 3 Date d'inscription dimanche 12 septembre 2010 Statut Membre Dernière intervention 20 juillet 2011
16 juil. 2011 à 21:23
Bonjour,

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.
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 369
20 juil. 2011 à 14:01
J'ai regardé plus attentivement ton code et je vais commencer par te faire des remarques simples, des remarques de base. Pour la conception objet, on verra ca après.

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.
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 369
20 juil. 2011 à 14:04
Par exemple le code de ta fonction nbcoup peut être factorisé simplement, dans tous les cas, tu fais presque la meme chose.

Tu peux aussi faire des fonction jouerNiveau1 et jouerNiveau2...
fate123 Messages postés 3 Date d'inscription dimanche 12 septembre 2010 Statut Membre Dernière intervention 20 juillet 2011
20 juil. 2011 à 23:10
merci pour tes conseils , c'est vrai que c'est illisible même pour moi qui tente de l'améliorer, je vais revoir tout ça.

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.