Projet Pacman I.OBJECTIF ET BESOIN

 
CONTINUER À LIRE
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 :                   (Idrissa)
     Eviter au Pacman de travers un mur.
     • 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 :        (Idrissa)
     Gestion du déplacement aléatoire des fantômes.
     • 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
Annexe
Fichier “Pacman.java”
1    import j a v a x . swing . JOptionPane ;
2    import j a v a x . swing . JPanel ;
3    import j a v a x . swing .Box;
4    class Pacman extends ProjetCase {
5        public int score =0;
6        public boolean superPastille = false ;
7        public int superCycle =0;
8        public static void main ( String [ ] args ) {
 9            // Definie les murs du fond
10            palette = new int [ ] {0 x00000000 , 0 x00FF0000 ,
11                                        0 x0000FF00 , 0x00FF00FF ,
12                                        0X00AAAAFF,0x00FFFF00};
13
14             fondCouleur = new int [ ] [ ] {{1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1} ,
15                                            {1 ,3 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1} ,
16                                            {1 ,0 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,0 ,1} ,
17                                            {1 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,1} ,
18                                            {1 ,0 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,1} ,
19                                            {1 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,1} ,
20                                            {1 ,0 ,1 ,0 ,1 ,1 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,1} ,
21                                            {1 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,1} ,
22                                            {1 ,0 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,0 ,1} ,
23                                            {1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,3 ,1} ,
24                                            {1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1}};
25
26             // plateau de jeu avec 20 collones et 11 lignes
27             new Pacman (11 ,20 ,25) ;
28        }
29
30        public Pacman ( int x , int y , int largeur ) {
31            super (x ,y , largeur ) ;
32            // permet un deplacement continu des pions du jeu
33            this . cycleContinue ( true ) ;
34            this . titreFenetre (" Pacman "+ score ) ;
35        }
36
37        @Override
38        public void declaration () {
39            // declares tous les pions du jeu
40            this . pions = new Pion [ 3 ] ;
41            // la vitesse de deplacement du jeu
42            this . c y c l e D e p l a ce men tS ec ond = 4;
43
44             // 1 er pion    ou pion pacman
45             pions [ 0 ] =   new PionPacman ( this ,1 ,5) ;
46             // 2 em pion    ou pion fantome
47             pions [ 1 ] =   new PionFantome ( this ,10 ,5) ;
48             // 3 em pion    ou pion fantome
49             pions [ 2 ] =   new PionFantome ( this ,9 ,5) ;
50        }
51
52        public void a c t i o n E s c a p e () {
53            this . cycleStop () ;
54            JOptionPane jop1 ;
55            jop1 = new JOptionPane () ;
56            jop1 . showMess ageDialog ( null , " appuyer s u r echap pour r e p r e n d r e " , null , ←-
                  JOptionPane .INFORMATION_MESSAGE) ;
57            this . cycleStart () ;
58        }
59   }

Fichier “PionFantome.java”
1    import j a v a x . swing . JOptionPane ;
2
3    class PionFantome extends Pion {
4        Pacman projet ;
5        public PionFantome ( Pacman projet , int posX , int posY ) {
6            super ( projet , posX , posY ) ;
7            this . projet = projet ;
8            // donne la couleur d ’ index 5 aux fantomes
9            this . couleurChange (5) ;
10       }
11
12       public void meurt () {
13           // renitialise la position du fantome a la case (5 ,9)
14           changePosition (9 ,5) ;
15       }
16
17       @Override
18       public void cycleVecteur ( int X , int Y ) {
19           int ancienVectX , ancienVectY ;
20           int vectChoixX =0 , vectChoixY =0;
21
22           ancienVectX = vectX ;
23           ancienVectY = vectY ;
24
25           // le choix aleatoire du déplacement est initialisé à 0
26           double mouvChoix = 0;
27           // Initialise la variable de type booleen mouvDeplacement à true
28           boolean selec tDeplacement = false ;
29           // le choix aleatoire est effectuer tant que mouvDeplacement est vrai
30           while (! selectDe placement ) {
31                // La variable mouvChoix va faire un choix aleatoire entre les ←-
                       entiers 0 ,1 ,2 ,3
32                mouvChoix = Math . f l o o r ( Math .random () *4) ;
33
34                // Test la possibilite du deplacement vers le haut
35                if (( mouvChoix == 0) && !(( ancienVectX ==0) && ( ancienVectY ==1) ) ) {
36                      vectChoixX = 0;
37                      vectChoixY = -1;
38                }
39
40                // test la possibilite du deplacement vers la droite
41                if (( mouvChoix == 1) && !(( ancienVectX == -1) && ( ancienVectY ==0) ) ) ←-
                       {
42                      vectChoixX = 1;
43                      vectChoixY =0;
44                }
45
46                // test la possibilite du deplacememnt vers le bas
47                if (( mouvChoix == 2) && !(( ancienVectX ==0) && ( ancienVectY == -1) ) ) {
48                      vectChoixX = 0;
49                      vectChoixY =1;
50                }
51
52                // test la possibilite du deplacement vers le gauche
53                if (( mouvChoix == 3) && !(( ancienVectX ==1) && ( ancienVectY ==0) ) ) {
54                      vectChoixX = -1;
55                      vectChoixY =0;
56                }
57
58                // si le fantome a deja un vecteur
59                if (!(( vectChoixX ==0) && ( vectChoixY ==0) ) ) {
60                     // verifie si la prochaine position est un mur
61                     if ( projet . fondCouleur [ getY () + vectChoixY ] [ getX () + vectChoixX ] ←-
                             != 1) {
62                           // le fantome ne rentre pas dans le mur
63                           selectDeplacement = true ;
64                        }
65                  }
66             }
67             // affecte au variables les vecteurs du pions
68             vectX = vectChoixX ;
69             vectY = vectChoixY ;
70        }
71   }

Fichier “PionPacman.java”
1    import j a v a x . swing . JOptionPane ;
2
3    class PionPacman extends Pion {
4        Pacman projet ;
5
6         public PionPacman ( Pacman projet , int posX , int posY ) {
7             super ( projet , posX , posY ) ;
8             this . projet = projet ;
9             // Donne la couleur d ’ index 4 au pion pacman
10            this . couleurChange (4) ;
11        }
12
13        @Override
14        public void changePosition ( int posX , int posY ) {
15            putX( posX ) ;
16            putY( posY ) ;
17            // vpour chaque pion fantome
18            for ( int k =1; k
50                caseC hangeC ouleur ( posX , posY ,2 ) ;
51                projet . score = projet . score +10;
52                projet . superPastille = true ;
53                projet . titreFenetre (" pacman "+ projet . score ) ;
54           }
55
56           if ( projet . superPastille == true ) {
57                 // le nombre de cycle augmente        quand en est en mode superPastille
58                 projet . superCycle ++;
59           }
60
61           if ( projet . superCycle == 20) {
62                 // apres 20 cycles le mode superPastille n ’ est plus active
63                 projet . superPastille = false ;
64                 projet . superCycle =0;
65           }
66
67           if ( projet . score ==126) {
68                 // affiche le gain de la partie si le score est egale à 126
69                 JOptionPane jop1 ;
70                 jop1 = new JOptionPane () ;
71                 jop1 . showMessageDialog ( null , " P a r t i e Gagnee " , null , JOptionPane .←-
                       WARNING_MESSAGE) ;
72                 projet . cycleStop () ;
73           }
74       }
75
76       @Override
77       public void cycleVecteur ( int actionX , int actionY ) {
78           vectX = actionX ;
79           vectY = actionY ;
80
81           // recupere la valeur de la variable x et y de la prochaine case que ←-
                  le pacman va atteindre
82           int x = getX () + vectX ;
83           int y = getY () + vectY ;
84           // si la couleur de cette case est rouge , le pacman sarrete et attend ←-
                  les commande du client
85           if ( projet . fondCouleur [ y ] [ x ] == 1) {
86                vectX = 0;
87                vectY =0;
88           }
89       }
90   }
Vous pouvez aussi lire