Petit pong

Soyez le premier à donner votre avis sur cette source.

Vue 12 049 fois - Téléchargée 975 fois

Description

Voici le début d'un petit jeu simple inspiré du célèbre Pong avec un petit algorithme de collisions.

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;

// réalisé par fate123

public class toto extends Applet implements Runnable
{
	
	int x_pos = 17;	// dimension de la balle	
	int y_pos = 100;	
	int radius = 7;
	int hauteur = 5; // dimension de la raquette
	int largeur = 40;//
	int possx = 50; // position de la raquette 
	int possy = 170;
	int vit = 1; // vitesse
	int score = 0;
	
	boolean perdu = false;
    boolean coll = false;
    boolean activation= true;
    
	public void init()
	{
		
		int vit = 2; // vitesse
		int score = 0;
		setBackground (Color.black);
		
	}

	public void start ()
	{
		
		Thread th = new Thread (this);	
		
		th.start ();
		
	}

	public void stop()
	{
      
	}

	public void destroy()
	{
     
	}

	public void run ()
	{
		
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
      
		
		while (!(perdu))
		{
			
				
						
						if((x_pos>0 ) && (x_pos<12)){	 // X collisions	
							
							x_pos= 15;
							
							coll = false;				
												
							}	
						else if((x_pos>188 ) && (x_pos<210 )){
							
							x_pos=184;
							
			              coll =true; 
			              }	
						if (y_pos>0 && y_pos<8){ // Y collisions
							
							y_pos= 12;
							
							activation=true;
						}
						else if ((y_pos>=possy-2 && y_pos<=possy-1)&&(x_pos >= possx && x_pos<= possx+largeur+1))
								{  // raquette collision
					       
							y_pos= possy - 10;
							score = score+15;
							activation = false;
						}
						
						//coin droit de la barre
						else if ((y_pos>possy-3 && y_pos<=possy+3)&&(x_pos > possx+(largeur+1) && x_pos< possx+largeur+9)){ 
							
							score = score+15;
							y_pos= possy - 7;
							x_pos= x_pos+10;
                           
							coll = false;   // la balle repart dans le sens inverse si elle touche le coin de la barre
							activation = false;
						}
						
						//coin gauche de la barre
						else if ((y_pos>possy-1 && y_pos<=possy+4)&&(x_pos < possx+1 && x_pos> possx-9)){ 
							
							score = score+15;
							
							y_pos= possy - 17;
							x_pos= x_pos-10;
                           
							coll = true;        // la balle repart dans le sens inverse si elle touche le coin de la barre
							activation = false;
						}
						
						if((x_pos>=15 ) && (coll==false) ){ // mouvement de la balle après collisions
								
							x_pos=x_pos+vit;	
			               
			              }
						else if ((x_pos<=184) && (coll==true) ){
									
							x_pos=x_pos-vit;	
							
						}

                       if((y_pos>= 12 ) && (activation==true) ){	
                    	 
							y_pos=y_pos+vit;
			               
			              }
						else if ((y_pos<=183) && (activation==false) ){
							
							y_pos=y_pos-vit;
										
						}
						
					    if(y_pos> possy+30)
					    {
					    	perdu = true;
					    	
					    }		                   						
						
                        repaint();
					
					
						
               
			
			try
			{
				
				Thread.sleep (20);
			}
			catch (InterruptedException ex)
			{
				
			}

			
			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
		}
		
	}
		


	public void paint (Graphics g)
	{
		g.setColor  (Color.green);
       
		g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
		
		g.setColor  (Color.yellow);
			g.drawString("Score : "+ score, 20, 190);
			
			  switch (score){
			    
              case 60 : vit=2;g.drawString("NIVEAU "+ vit,60,80); break;
			    case 150 : vit=3;g.drawString("NIVEAU "+ vit,60,80); break;
			    case 415 :	vit=4;g.drawString("NIVEAU "+ vit,60,80); break;
			    
			    }
			    
	       
		 if((perdu)){ g.drawString("GAME OVER",50,80);
  	   
  	   }
		
		 g.setColor(Color.red);
		 g.fillRect(possx,170,largeur,hauteur);
		 
         
	}
	
	

	public boolean mouseMove(Event evt, int x, int y) 
	   {  possx=x; repaint();   return true;}	 
	 }

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
10 mars 2011 à 23:41
Salut,

pour les Threads effectivement il n'y a pas lieu de se précipiter. J'ai été un peu vite en besogne ( :=D ). Il est vrai que ce n'est pas le premier sujet à aborder.
fate123 Messages postés 3 Date d'inscription dimanche 12 septembre 2010 Statut Membre Dernière intervention 20 juillet 2011
10 mars 2011 à 12:14
Salut lolof,

non au contraire merci pour tes conseils, j'ai jeté un oeil à la synchronisation des threads et franchement ça me dépasse, je vais y aller progressivement.Je vais donc commmencé par rendre le code plus lisible et tenter d'ajouter des fonctionnalités au programme du moins je vais essayé.
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
9 mars 2011 à 13:38
Bonjour,

moi je trouve que c'est déjà une très bon début pour un débutant d'avoir compris à quoi sert la méthode run() de Thread et la méthode paint() de Applet.

Après, si tu veux que ton programme soit plus fluide, il faudrait à mon avis réserver un Thread pour la gestion de la balle, deux Threads pour les deux raquettes et enfin, un Thread pour le traitement principal.
La principale difficulté, et surement pas des moindres, serait alors de réussir une parfaite communication entre tous ces Threads. Mais bon, cela serait peut être un peu rapide pour débuter (Mais, si je peux me permettre, tu as l'air de pouvoir apprendre vite, alors pourquoi pas aller plus loin avec les Threads et la synchronisation, histoire d'être encore plus performant ? :). Pour info, je programme en Java depuis 5 ans, et je commence à peine la synchrosation. Mais quelque chose me dit que tu pourrais être beaucoup plus rapide que moi).

Autre chose, ton code run() est trop complexe à lire pour quelqu'un qui n'a pas été à tes côtés au moment du développement :
-> utiliser un certain nombre de fonctions afin de la réduire à une vingtaine de ligne maximum pourrait faciliter
-> remplacer les valeurs numériques par des constantes (variables déclarées comme étant final) aussi faciliterait la visibilité
Deux méthodes très simples pour clarifier ton code (le nommage des variables, quant à lui, semble déjà assez explicite et judicieux).

Voilà, j'espère que tu ne m'en voudras pas pour ce que je me suis permis de te dire.

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.