Projet Pacman
Transcription
Projet Pacman
Projet Pacman I.OBJECTIF ET BESOIN Notre projet est de créer un jeu de Pacman où le Pacman se déplace dans le plateau, notamment entre les couloirs, sans traverser les murs; les touches directionnelles permettent au client de contrôler le Pacman et le but du jeu est de passer sur toutes pastilles du jeu, tout en évitant les fantômes. Il y a 2 super-pastilles à deux coins du plateau de jeu qui, une fois mangée, donne au Pacman des supers pouvoirs (30 secondes environ) et permet au Pacman de manger les fantômes. La partie sera gagnée si le Pacman a mangé toutes les pastilles du jeu. Le rôle des fantômes est de rendre plus difficile le jeu. Ceux ci ont deux modes de fonctionnement : • En état « normal », les fantômes se déplacent aléatoirement au début du jeu et plus le niveau augmente et plus les fantômes deviendront intelligents en suivant le Pacman. La collision du Pacman et d’un Fantôme fait perdre la partie. • En état « effrayé », les fantômes changent de couleurs, ralentissent et se déplacent de manière à s'éloigner du Pacman. Si le fantôme effrayé touche le Pacman, il retourne alors au centre du plateau et revient à l'état « normal ». II. FONCTIONNALITÉS / CONTRAINTES • Gérer le déplacement du Pacman et des fantômes : Ils ne doivent pas sortir du cadre du jeu, ils ne doivent pas rentrer dans un mur : dans ce cas, les fantômes changent de direction aléatoirement alors que le Pacman attend l’instruction de l’utilisateur. • Gestion du déplacement du fantôme en fonction du niveau de jeu. • Créer les super pastilles modifiant le rôle des fantômes et du Pacman. • Gestion du score : le Pacman modifie la couleur des cases sur lequel il passe : une nouvelle case rapporte 1 point et une superpastille rapporte 10 points. III. DESCRIPTION DE L’AVANCEMENT DU PROJET 1. Etape d’avancement du projet • Durant la séance du 02/02/2015 : (Idrissa) Création de la structure du plateau de jeu (Mur du jeu et couloir de déplacement du Pacman). • Durant les séances du 09-16/01/2015 : Eviter au Pacman de travers un mur. (Idrissa) • Durant les séances du 09-16/02/2015 : (Mamadou) Gérer la modification des couleurs des cases en cas du passage du pacman et le décompte des points. • Durant la séance du 09/03/2015 : (Mamadou) Mettre en place les super pastilles modifiant le rôle des fantômes et du pacman. • Durant les séances du 16/03/2015 au 11/05/2014 : Gestion du déplacement aléatoire des fantômes. (Idrissa) • Durant la séance du 18/05/2014 (Idrissa et Mamadou): Affichage de la fin du jeu (gagné ou perdu). 2. Difficulté à mettre le travail en commun On a rencontré quelques difficulté à mettre notre code en commun avec d’un côté les modifications à faire pour que le code de l’un marche correctement chez l’autre et vice-versa (Emplacement, variables à déclarer, etc...) ; et de l’autre, l’explication brève du code et de son rôle. 3. Développement ultérieur du projet • Le code peut être amélioré en dotant le fantôme d'une intelligence artificielle. • Actuellement, le jeu ne possède pas de niveaux de difficulté : il faudrait le doter de plusieurs niveaux de jeu, c'est-à-dire qu'en fonction du score du jeu, la difficulté du jeu augmentera. On peut augmenter la difficulté du jeu en réduisant la durée des cycles (augmentant la vitesse des pions), ralentir le Pacman, modifier le plateau de jeu, augmenter le nombre de fantômes ... 4. Remarque Nous n'avons pas réussi à implémenter entièrement le code qui gère la collision Pacman-fantôme car dans la version présente, la collision n'est valable que lorsque le Pacman et le fantôme arrive sur une même case mais ne marche pas lorsqu'ils se croisent. IV. IMPLANTATION EN JAVA 1. Variables : a) palette Cette variable est un tableau d'entiers contenant la totalité des couleurs utilisées dans le jeu (murs, pastilles, pions, super_pastille...). Chaque couleur est désignée par un nombre hexadécimal et repéré par son index dans cette variable. b) fondCouleur Cette variable est un tableau à deux dimensions permettant de définir la couleur des cases du plateau de jeu, une valeur de cette variable correspond à l'index de la couleur utilisée pour la case. 2. Description des fonctions c) Arrêt lors de la rencontre d’un mur • Explication Pour que le Pacman ne rentre pas dans un mur, on doit détecter si sa prochaine position sera un mur. Si c’est le cas, il attribue aux vecteurs vectX et vectY du Pacman la valeur 0 afin que le Pacman s’arrête avant le mur et attende la prochaine action du joueur. Nous utilisons deux variables x et y qui représenteront la prochaine position du Pacman. On vérifie ensuite que la prochaine case repérée par la position (x,y) est un mur : c’est-a-dire possède une couleur d’index 1 (Couleur rouge). • Algorithme x=abscisse de la prochaine case ; y=ordonne de la prochaine case ; Si (l'index de la prochaine destination du pacman est rouge) Alors : vectX devient nul ; vectY devient nul ; Fin si • Implémentation java //récupère la valeur de la prochaine case que le pacman va atteindre int x = getX()+vectX; int y = getY()+vectY; //si la couleur de cette case est rouge, le pacman s’arrête et attend les commandes du client if (projet.fondCouleur[y][x] == 1){ vectX= 0; vectY=0; } d) Déplacement du Fantôme • Description Cette fonction a pour objectif de permettre au fantôme de se déplacer de manière aléatoire dans les couloirs du plateau de jeu. Les vecteurs des fantômes subiront une modification pour qu'il se déplace aléatoirement sans retour sur ses pas. On utilise les deux variables vectChoixX et vectChoixY qui seront affectées des valeurs de la position actuelle à laquelle on ajoute le vecteur vitesse (vectX,vectY) afin d’obtenir la prochaine position du Pacman. Ces deux variables vont permettre de savoir le nombre de possibilités dont le fantôme dispose afin de lui accorder un vecteur aléatoire grâce au binaire (0,1,2,3) représentant respectivement les directions haut, droite, bas, gauche. La fonction « math.random() » sera utilisée. • Algorithme mouvChoix : variable stockant les positions mouvDeplacement :boolean permettant d'exécuter le choix aléatoire les variables ancienvectX et ancienvectY stockent les anciennes vecteurs du fantomes . les variables vectchoixX et ancienvectchoixY stockent les vecteurs qui seront affecte au fantômes une voix le choix aléatoire exécuter . Tant que (mouvDeplacement est vrai){ mouvChoix choisi entre 0,1,2,3 si (mouvChoix = 0 et ancienvectX different de 0 et ancienvectY est différent de 1) { vectchoixX = 0; vectchoixy = -1 ; fin si fin tant que • Implémentation java boolean selectDeplacement=false; //le choix aleatoire est effectuer tant que mouvDeplacement est vrai while(!selectDeplacement){ // La variable mouvChoix va faire un choix aleatoire entre les entiers 0,1,2,3 mouvChoix = Math.floor(Math.random()*4); //Test la possibilite du deplacement vers le haut if((mouvChoix == 0) && !((ancienVectX==0) && (ancienVectY==1))){ vectChoixX = 0; vectChoixY = -1; } //si le fantome a deja un vecteur if(!((vectChoixX==0) && (vectChoixY==0))){ //verifie si la prochaine position est un mur if(projet.fondCouleur[getY()+vectChoixY][getX() +vectChoixX] != 1){ //le fantome ne rentre pas dans le mur selectDeplacement=true; } } } e) Score • Description La variable « score » permet de comptabiliser le nombre de cases sur lequel passe le Pacman. Après le passage du pacman sur une case non coloriée, la case sera coloriée. La variable score est positionnée initialiser à 0 dans le fichier Pacman Quand le Pacman passe sur une des 2 super pastilles le score augmente de 10 points Pour savoir si la case sera comptabilisée ou non, on utilise la fonction « changePosition() » pour connaître le prochain déplacement du Pacman si la case n’est pas coloriée le score augmente de 1… si la case est déjà coloriée le score ne varie pas. • Algorithme Si(la valeur de fondCouleur à l’index (posX ,posY) vaut 0 ) alors ; On augmente le Score de 1; Fin si Si(la valeur de fondCouleur à l’index (posY,posX vaut 3) Alors ; On augmente le score de 10 On affecte une valeur de l’index de la couleur qui vaut 2 à la variable fondCouleur On affecte la valeur 2 à l’index (posX,posY) de la variable fondCouleur Fin sinon • Implémentation java if(ProjetCase.fondCouleur[posY][posX]==0){ caseChangeCouleur(posX,posY,2 ); projet.score++; } f) Super pastille • Description L’objectif est de créer 2 super pastilles dans les extrémités du plateau. Quand le Pacman passe sur une super pastille, les fantômes fuient le Pacman car ils sont confrontés au danger d’être mangé par le Pacman. Ce moment dure 20 cycles de jeu. La variable « superCycle » qui à pour but de comptabiliser le nombre de cycles • Algorithme //Initialisation des variables La variable.peur de type booléen prend valeur par défaut false //Vérification du passage sur une super pastille Si( le pacman passe sur une super pastille) Alors ; La variable peur de type boolean passe à true ; fin sinon //Gestion de la variable supercycle pour chaque cycle Si( la variable peur de type booléen vaut true) Alors ; La variable superCyle augmente d’un Fin si si( la variable superCycle vaut 20) alors ; la variable peur de type booléen prend la valeur false la variable superCycle est initialisée à 0 fin si • Implémentation java if(ProjetCase.fondCouleur[posY][posX]==3){ caseChangeCouleur(posX,posY,2 ); projet.score = projet.score+10; projet.superPastille = true; } if(projet.superPastille == true){ projet.superCycle++; } if(projet.superCycle == 20){ projet.superPastille = false; projet.superCycle=0; } g) Gain ou perte de la partie • Description Il s’agit de gérer la perte de la partie si le Pacman croise un Fantôme et d’afficher le score, et de gérer le gain de la partie si le Pacman arrive a manger toutes les pastilles du jeu c'est-à-dire a rendre toutes les cases noires en vertes. • Algorithme Pour (chaque pion fantôme [k]) Si (position du Pacman = La position du fantôme) Alors Si (Super Pastille est activée) alors : Le fantôme meurt et vois sa position se réinitialiser Sinon alors : Afficher le Message Partie Perdu Fin Si Si (Score = 160) alors : Afficher le message du gain de la partie. Fin Si • Implémentation java for(int k=1;k<3;k++){ if((projet.pions[k].getX() == getX()) && (projet.pions[k].getY() == getY() )) { if(projet.superPastille == true){ PionFantome rr = (PionFantome) projet.pions[k]; rr.meurt(); rr.cycleFin(); } else{ JOptionPane jop1; jop1= new JoptionPane(); jop1.showMessageDialog(null, "Collision, Partie Perdu",null, JoptionPane.WARNING_MESSAGE); } } } if(projet.score==126){ JOptionPane jop1; jop1= new JoptionPane(); jop1.showMessageDialog(null, " Partie Gagnee",null, JoptionPane.WARNING_MESSAGE);} } Annexe Fichier “Pacman.java” 1 2 3 4 5 6 7 8 9 10 11 12 import j a v a x . swing . JOptionPane ; import j a v a x . swing . JPanel ; import j a v a x . swing .Box; class Pacman extends ProjetCase { public int score =0; public boolean superPastille = false ; public int superCycle =0; public static void main ( String [ ] args ) { // Definie les murs du fond palette = new int [ ] {0 x00000000 , 0 x00FF0000 , 0 x0000FF00 , 0x00FF00FF , 0X00AAAAFF,0x00FFFF00}; 13 fondCouleur = new int [ ] [ ] {{1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1} , {1 ,3 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1} , {1 ,0 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,0 ,1} , {1 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,1} , {1 ,0 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,1} , {1 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,1} , {1 ,0 ,1 ,0 ,1 ,1 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,1} , {1 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,1} , {1 ,0 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,0 ,1} , {1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,3 ,1} , {1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1}}; 14 15 16 17 18 19 20 21 22 23 24 25 // plateau de jeu avec 20 collones et 11 lignes new Pacman (11 ,20 ,25) ; 26 27 28 29 } 30 31 public Pacman ( int x , int y , int largeur ) { super (x ,y , largeur ) ; // permet un deplacement continu des pions du jeu this . cycleContinue ( true ) ; this . titreFenetre (" Pacman "+ score ) ; } 32 33 34 35 36 37 @Override public void declaration () { // declares tous les pions du jeu this . pions = new Pion [ 3 ] ; // la vitesse de deplacement du jeu this . c y c l e D e p l a ce men tS ec ond = 4; 38 39 40 41 42 43 // 1 er pion pions [ 0 ] = // 2 em pion pions [ 1 ] = // 3 em pion pions [ 2 ] = 44 45 46 47 48 49 50 } 51 52 public void a c t i o n E s c a p e () { this . cycleStop () ; JOptionPane jop1 ; jop1 = new JOptionPane () ; jop1 . showMess ageDialog ( null , " appuyer s u r echap pour r e p r e n d r e " , null , ←JOptionPane .INFORMATION_MESSAGE) ; this . cycleStart () ; } 53 54 55 56 57 58 59 ou pion pacman new PionPacman ( this ,1 ,5) ; ou pion fantome new PionFantome ( this ,10 ,5) ; ou pion fantome new PionFantome ( this ,9 ,5) ; } Fichier “PionFantome.java” 1 import j a v a x . swing . JOptionPane ; 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 class PionFantome extends Pion { Pacman projet ; public PionFantome ( Pacman projet , int posX , int posY ) { super ( projet , posX , posY ) ; this . projet = projet ; // donne la couleur d ’ index 5 aux fantomes this . couleurChange (5) ; } public void meurt () { // renitialise la position du fantome a la case (5 ,9) changePosition (9 ,5) ; } @Override public void cycleVecteur ( int X , int Y ) { int ancienVectX , ancienVectY ; int vectChoixX =0 , vectChoixY =0; ancienVectX = vectX ; ancienVectY = vectY ; // le choix aleatoire du déplacement est initialisé à 0 double mouvChoix = 0; // Initialise la variable de type booleen mouvDeplacement à true boolean selec tDeplacement = false ; // le choix aleatoire est effectuer tant que mouvDeplacement est vrai while (! selectDe placement ) { // La variable mouvChoix va faire un choix aleatoire entre les ←entiers 0 ,1 ,2 ,3 mouvChoix = Math . f l o o r ( Math .random () *4) ; // Test la possibilite du deplacement vers le haut if (( mouvChoix == 0) && !(( ancienVectX ==0) && ( ancienVectY ==1) ) ) { vectChoixX = 0; vectChoixY = -1; } // test la possibilite du deplacement vers la droite if (( mouvChoix == 1) && !(( ancienVectX == -1) && ( ancienVectY ==0) ) ) ←{ vectChoixX = 1; vectChoixY =0; } // test la possibilite du deplacememnt vers le bas if (( mouvChoix == 2) && !(( ancienVectX ==0) && ( ancienVectY == -1) ) ) { vectChoixX = 0; vectChoixY =1; } // test la possibilite du deplacement vers le gauche if (( mouvChoix == 3) && !(( ancienVectX ==1) && ( ancienVectY ==0) ) ) { vectChoixX = -1; vectChoixY =0; } // si le fantome a deja un vecteur if (!(( vectChoixX ==0) && ( vectChoixY ==0) ) ) { // verifie si la prochaine position est un mur if ( projet . fondCouleur [ getY () + vectChoixY ] [ getX () + vectChoixX ] ←!= 1) { // le fantome ne rentre pas dans le mur selectDeplacement = true ; } 64 65 } } // affecte au variables les vecteurs du pions vectX = vectChoixX ; vectY = vectChoixY ; 66 67 68 69 70 71 } } Fichier “PionPacman.java” 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 import j a v a x . swing . JOptionPane ; class PionPacman extends Pion { Pacman projet ; public PionPacman ( Pacman projet , int posX , int posY ) { super ( projet , posX , posY ) ; this . projet = projet ; // Donne la couleur d ’ index 4 au pion pacman this . couleurChange (4) ; } @Override public void changePosition ( int posX , int posY ) { putX( posX ) ; putY( posY ) ; // vpour chaque pion fantome for ( int k =1; k <3; k ++) { if ( // Vérification que Pacman / Fantome tombe sur une même case (( projet . pions [ k ] . getX () == getX () ) && ( projet . pions [ k ] . getY ()←== getY () ) ) || ( false ) ) { // si le mode superPastille est activé if ( projet . superPastille == true ) { // Le mode est en superPastille : le pacman remet le ←fantome au centre du plateau en cas de collision PionFantome r r = ( PionFantome ) projet . pions [ k ] ; r r . meurt () ; r r . c y c l e F i n () ; } else { // Le fantome mange le pacman sans superpouvoir : la ←partie est perdu System . out . p r i n t l n (" C o l l i s i o n ") ; JOptionPane jop1 ; jop1 = new JOptionPane () ; jop1 . showMessageDialog ( null , " C o l l i s i o n , P a r t i e Perdu " ,←null , JOptionPane .WARNING_MESSAGE) ; projet . cycleStop () ; } } } if ( ProjetCase . fondCouleur [ posY ] [ posX ] ==0) { // si le pacman passe sur une case , la case devient verte et le ←score augmente de 1 points caseC hangeC ouleur ( posX , posY ,2) ; projet . score ++; projet . titreFenetre (" pacman "+ projet . score ) ; } if ( ProjetCase . fondCouleur [ posY ] [ posX ] ==3) { // si le pacman passe sur une superpastille , la pastille ←disparait et le score augmente de 10 points caseC hangeC ouleur ( posX , posY ,2 ) ; projet . score = projet . score +10; projet . superPastille = true ; projet . titreFenetre (" pacman "+ projet . score ) ; 50 51 52 53 54 55 } 56 57 if ( projet . superPastille == true ) { // le nombre de cycle augmente projet . superCycle ++; } 58 59 quand en est en mode superPastille 60 if ( projet . superCycle == 20) { // apres 20 cycles le mode superPastille n ’ est plus active projet . superPastille = false ; projet . superCycle =0; } 61 62 63 64 65 66 if ( projet . score ==126) { // affiche le gain de la partie si le score est egale à 126 JOptionPane jop1 ; jop1 = new JOptionPane () ; jop1 . showMessageDialog ( null , " P a r t i e Gagnee " , null , JOptionPane .←WARNING_MESSAGE) ; projet . cycleStop () ; } 67 68 69 70 71 72 73 74 75 } 76 77 @Override public void cycleVecteur ( int actionX , int actionY ) { vectX = actionX ; vectY = actionY ; 78 79 80 81 // recupere la valeur de la variable x et y de la prochaine case que ←le pacman va atteindre int x = getX () + vectX ; int y = getY () + vectY ; // si la couleur de cette case est rouge , le pacman sarrete et attend ←les commande du client if ( projet . fondCouleur [ y ] [ x ] == 1) { vectX = 0; vectY =0; } 82 83 84 85 86 87 88 89 90 } }