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 }
|