Morpion.java
001 package fr.isae.morpion.model;
002 
003 /**
004  <code>Morpion</code> est une classe qui permet de gerer un jeu
005  *  de morpion 3*3.
006  *
007  @author <a href="mailto:garion@isae.fr">Christophe Garion</a>
008  @version 1.0
009  */
010 public class Morpion {
011     /**
012      <code>NEUTRE</code> est une constante representant les cases
013      *  sur lesquelles rien n'a ete joue.
014      *
015      */
016     public final static int NEUTRE = 0;
017 
018     /**
019      <code>CROIX</code> est une constante representant les cases
020      *  jouees par le joueur "croix".
021      *
022      */
023     public final static int CROIX = 1;
024 
025     /**
026      <code>ROND</code> est une constante representant les cases
027      *  jouees par le joueur "rond".
028      *
029      */
030     public final static int ROND = 2;
031 
032     private int[][] cases;
033 
034     private int joueur;
035 
036     private int nbCoups;
037 
038     /**
039      * Cree une nouvelle instance de <code>Morpion</code>.
040      *
041      */
042     public Morpion() {
043         cases = new int[3][3];
044         joueur = CROIX;
045     }
046 
047     /**
048      <code>recommencer</code> permet de recommencer une partie.
049      *
050      */
051     public void recommencer() {
052         for (int i = 0; i < 3; i++) {
053             for (int j = 0; j < 3; j++ ) {
054                 cases[i][j= NEUTRE;
055             }
056         }
057         joueur = CROIX;
058         nbCoups = 0;
059     }
060 
061     /**
062      <code>setCase</code> permet de "mettre" une croix ou un
063      *  rond dans une case du jeu. Il faut que la case soit vide.
064      *  On verifie que la partie est gagnee. Si ce n'est pas le
065      *  cas, on change alors de joueur et on augmente le nombre de
066      *  coups.
067      *
068      @param i un <code>int</code> representant la colonne (on commence
069      *          a zero !)
070      @param j un <code>int</code> representant la ligne (on commence
071      *          a zero !)
072      @return un <code>boolean</code> qui est <code>false</code> si
073      *         la partie n'est pas gagnee
074      */
075     public boolean setCase(int i, int j) {
076         if (cases[i][j== NEUTRE) {
077             cases[i][j= joueur;
078       
079             nbCoups++;
080             
081             if (gagne(i,j)) {
082                 return true;
083             }
084             
085             joueur = joueur == CROIX ? ROND : CROIX);
086         }
087         return false;
088     }
089 
090     /**
091      <code>gagne</code> permet de verifier si un des joueurs a gagne
092      *  apres qu'une certaine case ait ete jouee.
093      *
094      @param i un <code>int</code> representant la colonne (on commence
095      *          a zero !) de la case jouee
096      @param j un <code>int</code> representant la ligne (on commence
097      *          a zero !) de la case jouee
098      @return un <code>boolean</code> qui est vrai si la partie est gagnee
099      *         par le joueur courant
100      */
101     private boolean gagne(int i, int j) {
102         return (((cases[i][0== cases[i][1]) && //ligne de la case pleine
103                  (cases[i][1== cases[i][2])) ||
104                 ((cases[0][j== cases[1][j]) && //col. de la case pleine
105                  (cases[1][j== cases[2][j])) ||
106                 ((i == j&&                     // diagonale pleine
107                  (cases[0][0== cases[1][1]) &&
108                  (cases[1][1== cases[2][2])) ||
109                 ((i + j == 2&&                 // diagonale pleine
110                  (cases[0][2== cases[1][1]) &&
111                  (cases[1][1== cases[2][0])));
112     }
113 
114     /**
115      <code>getJoueur</code> permet d'acceder au joueur courant.
116      *
117      @return un <code>int</code> qui est le joueur courant (cf.
118      *         constantes de la classe)
119      */
120     public int getJoueur() {
121         return joueur;
122     }
123 
124     /**
125      <code>getNbCoups</code> renvoie le nombre de coups joues.
126      *
127      @return un <code>int</code> qui est le nombre de coups joues. 
128      */
129     public int getNbCoups() {
130         return nbCoups;
131     }
132 }