diff --git a/projetAgile/Makefile b/projetAgile/Makefile index 9273cd3..222304a 100644 --- a/projetAgile/Makefile +++ b/projetAgile/Makefile @@ -133,7 +133,8 @@ build/$(PACKAGE_PATH)/Menu/View/Menu.class : src/$(PACKAGE_PATH)/Menu/View/Menu. build/$(PACKAGE_PATH)/Menu/Controller/ObservateurMenuSouris.class \ build/$(PACKAGE_PATH)/Menu/View/BoutonsMenu.class \ build/$(PACKAGE_PATH)/Menu/Controller/ObservateurFenetre.class \ - build/$(PACKAGE_PATH)/Puissance4/LancementPuissance4.class + build/$(PACKAGE_PATH)/Menu/Controleur/ObservateurAccueil.class \ + build/$(PACKAGE_PATH)/Puissance4/LancementPuissance4.class @javac $(@JAVAC_OPT) $< diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Menu/Controller/package-info.java b/projetAgile/src/fr/iutfbleau/projetAgile/Menu/Controller/package-info.java new file mode 100644 index 0000000..f6588c2 --- /dev/null +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Menu/Controller/package-info.java @@ -0,0 +1,5 @@ +/** + * fr.iutfbleau.projetAgile.Menu groupe toutes les classes qui controllent le menu (Listener) + */ +package fr.iutfbleau.projetAgile.Menu.Controller; +//Fichier vide pour la javadoc \ No newline at end of file diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Menu/View/Menu.java b/projetAgile/src/fr/iutfbleau/projetAgile/Menu/View/Menu.java index 891cf48..7dd85d1 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Menu/View/Menu.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Menu/View/Menu.java @@ -9,6 +9,7 @@ import fr.iutfbleau.projetAgile.Jeu; import fr.iutfbleau.projetAgile.Menu.Controller.*; import fr.iutfbleau.projetAgile.Puissance4.LancementPuissance4; import java.awt.event.WindowListener; +import java.util.concurrent.CancellationException; public abstract class Menu{ public static String PUISSANCE_4="puissance4"; @@ -141,7 +142,7 @@ public abstract class Menu{ if(g==Menu.PUISSANCE_4){ try{ jeu = new LancementPuissance4(Menu.frame); - }catch(Exception e){ + }catch(CancellationException e){ return; } } diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Menu/View/package-info.java b/projetAgile/src/fr/iutfbleau/projetAgile/Menu/View/package-info.java new file mode 100644 index 0000000..1da42ff --- /dev/null +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Menu/View/package-info.java @@ -0,0 +1,5 @@ +/** + * fr.iutfbleau.projetAgile.Menu groupe toutes les classes de la vue du menu + */ +package fr.iutfbleau.projetAgile.Menu.View; +//Fichier vide pour la javadoc \ No newline at end of file diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/Puissance4Controller.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/Puissance4Controller.java index 5ae6697..1d9e6d0 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/Puissance4Controller.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/Puissance4Controller.java @@ -44,10 +44,12 @@ public class Puissance4Controller { */ public void initPanel() { this.panel.init(); - this.panel.setPlayerNumber(this.modele.getPlayerNumber()); this.panel.changeHoverColor(this.modele.getPlayerTurn()); this.panel.changeLabel(this.modele.getPlayerTurn()); - this.panel.changeScore(this.modele.getPlayerOneScore(), this.modele.getPlayerTwoScore(), this.modele.getPlayerThreeScore()); + if(this.modele.getPlayerNumber() == 2) + this.panel.changeScore(this.modele.getPlayerOneScore(), this.modele.getPlayerTwoScore()); + else + this.panel.changeScore(this.modele.getPlayerOneScore(), this.modele.getPlayerTwoScore(), this.modele.getPlayerThreeScore()); } /** @@ -63,10 +65,6 @@ public class Puissance4Controller { } this.grille.reset(); this.modele.reset(); - if(this.modele.getPlayerThreeName() != null) { - this.modele.setPlayerNumber(3); - this.panel.setPlayerNumber(3); - } this.panel.changeHoverColor(this.modele.getPlayerTurn()); this.panel.changeLabel(this.modele.getPlayerTurn()); } diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/package-info.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/package-info.java new file mode 100644 index 0000000..77f0c61 --- /dev/null +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/package-info.java @@ -0,0 +1,5 @@ +/** + * fr.iutfbleau.projetAgile.Puissance4.Controller groupe toutes les classes qui controllent les évènements (Listeners) du Puissance 4 + */ +package fr.iutfbleau.projetAgile.Puissance4.Controller; +//Fichier vide pour la javadoc \ No newline at end of file diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Event/package-info.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Event/package-info.java new file mode 100644 index 0000000..1d010c6 --- /dev/null +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Event/package-info.java @@ -0,0 +1,5 @@ +/** + * fr.iutfbleau.projetAgile.Puissance4.Event groupe toutes les classes représentant un évènement personnalisé du Puissance 4 + */ +package fr.iutfbleau.projetAgile.Puissance4.Event; +//Fichier vide pour la javadoc \ No newline at end of file diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/LancementPuissance4.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/LancementPuissance4.java index e912550..301f916 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/LancementPuissance4.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/LancementPuissance4.java @@ -39,6 +39,7 @@ public class LancementPuissance4 implements Jeu{ ButtonGroup buttons = new ButtonGroup(); buttons.add(twoPlayer); buttons.add(threePlayer); + buttons.setSelected(twoPlayer.getModel(), true); Object[] message = { "Combien de joueurs ?", twoPlayer, threePlayer }; diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Model/GrilleModel.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Model/GrilleModel.java index 6b2dea3..e873792 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Model/GrilleModel.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Model/GrilleModel.java @@ -21,7 +21,7 @@ public class GrilleModel extends AbstractGridInitiater{ private int playerOneScore; private int playerTwoScore; private int playerThreeScore; - private LinkedList tour; + private LinkedList playersList; private int playerNumber; /** * Crée le modèle et l'initialise avec des cases vides @@ -33,34 +33,11 @@ public class GrilleModel extends AbstractGridInitiater{ this.grille = new int[this.column][this.row]; this.playerOneScore = 0; this.playerTwoScore = 0; - this.playerThreeScore = 0; - this.tour = new LinkedList(); - this.tour.add(Constants.PLAYER_ONE); - this.tour.add(Constants.PLAYER_TWO); - if(playerNumber==3){ - this.tour.add(Constants.PLAYER_THREE); - } - this.playerNumber=playerNumber; - this.reset(); - } - - /** - * Crée le modèle et l'initialise avec des les cases du tableau donné en arguments - */ - public GrilleModel(int[][] tab, int playerNumber) { - //Faire un test pour le nombre de colonnes/lignes - super(); - this.column = Constants.COLUMN_COUNT; - this.row = Constants.ROW_COUNT; - this.grille = tab; - this.playerOneScore = 0; - this.playerTwoScore = 0; - this.playerThreeScore = 0; - this.tour=new LinkedList(); - this.tour.add(Constants.PLAYER_ONE); - this.tour.add(Constants.PLAYER_TWO); - if(playerNumber==3){ - this.tour.add(Constants.PLAYER_THREE); + this.playerThreeScore = -1; + this.playersList = new LinkedList(); + this.resetList(); + if(playerNumber == 3){ + this.playerThreeScore = 0; } this.playerNumber=playerNumber; this.reset(); @@ -75,17 +52,21 @@ public class GrilleModel extends AbstractGridInitiater{ this.grille[i][j] = Constants.EMPTY_PLAYER; } } - this.tour.clear(); - this.tour.add(Constants.PLAYER_ONE); - this.tour.add(Constants.PLAYER_TWO); - if(this.playerNumber==3){ - this.tour.add(Constants.PLAYER_THREE); - } + this.resetList(); this.switchPlayer(); this.piecePlayed = 0; this.setPartyStatus(GameStatus.PLAYING); } + private void resetList() { + this.playersList.clear(); + this.playersList.add(Constants.PLAYER_ONE); + this.playersList.add(Constants.PLAYER_TWO); + if(this.playerNumber==3){ + this.playersList.add(Constants.PLAYER_THREE); + } + } + private void addPiece(int column, int row) { grille[column][row] = this.playerTurn; fireGridChanged(column, row, this.playerTurn); @@ -93,14 +74,14 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Ajoute un pion dans une colonne si elle n'est pas complète, met à jour le status de la partie et change le tour du joueur si nécessaire + * Ajoute un pion dans une colonne si elle n'est pas complète, met à jour le status de la partie et change le playersList du joueur si nécessaire * @param column La colonne dans laquelle ajouter le pion */ public void verifyColumn(int column) { for (int row = this.row - 1; row >= 0; row--) { if (grille[column][row] == Constants.EMPTY_PLAYER) { this.addPiece(column, row); - if(!this.verifyWin(column, row)){ + if(!this.verifyWin(column, row, this.playerTurn)){ this.switchPlayer(); } this.verifyDraw(); @@ -109,20 +90,53 @@ public class GrilleModel extends AbstractGridInitiater{ } } - /** + private void removePlayer(){ + this.increaseScore(); + this.removePlayerPion(); + this.firePlayerChanged(this.playerTurn, this.grille); + this.playersList.pollLast(); + this.switchPlayer(); + this.verifyNewWin(); + } + + private void verifyNewWin() { + int firstLastPlayer = this.playersList.get(0); + int seconfLastPlayer = this.playersList.get(1); + boolean verifyFirstWin = this.verifyWinAll(firstLastPlayer); + boolean verifySecondWin = this.verifyWinAll(seconfLastPlayer); + if(verifyFirstWin && verifySecondWin) { + this.setPartyStatus(GameStatus.DRAW); + } + else if(verifyFirstWin || verifySecondWin) { + this.playerTurn = verifyFirstWin ? firstLastPlayer : seconfLastPlayer; + this.setPartyStatus(GameStatus.WIN); + } + } + + public boolean verifyWinAll(int playerColor) { + for(int y = 0; y < this.column; y++) { + for(int x = this.row - 1; x >= 0; x--) { + if(this.grille[y][x] == playerColor) + if(verifyWin(y, x, playerColor)) + return true; + } + } + return false; + } + + /** * Vérifie si le jeton qui vient d'être joué termine la partie * @param column La colonne du pion qui vient d'être joué * @param row La ligne du pion qui vient d'être joué - * @return Retourne true si le jeu est fini + * @return retourne true si le jeu est fini */ - private boolean verifyWin(int column, int row) { - int playerColor = this.playerTurn; + private boolean verifyWin(int column, int row, int playerColor) { int diagonalColumn = column; int diagonalRow = row; //Vérification horizontal et vertical if(verifyAlignedPiece(column, 0, 0, 1, playerColor) || verifyAlignedPiece(0, row, 1, 0, playerColor)) { - if(this.tour.size()==3){ - this.Player3(); + if(this.playersList.size()==3){ + this.removePlayer(); }else{ this.setPartyStatus(GameStatus.WIN); } @@ -135,8 +149,8 @@ public class GrilleModel extends AbstractGridInitiater{ } //Vérification diagonale haut à gauche -> bas à droite if(verifyAlignedPiece(diagonalColumn, diagonalRow, 1, 1, playerColor)) { - if(this.tour.size()==3){ - this.Player3(); + if(this.playersList.size() > 2){ + this.removePlayer(); }else{ this.setPartyStatus(GameStatus.WIN); } @@ -152,8 +166,8 @@ public class GrilleModel extends AbstractGridInitiater{ //Vérification diagonale haut à droite -> bas à gauche if(verifyAlignedPiece(diagonalColumn, diagonalRow, -1, 1, playerColor)) { - if(this.tour.size()==3){ - this.Player3(); + if(this.playersList.size() > 2){ + this.removePlayer(); }else{ this.setPartyStatus(GameStatus.WIN); } @@ -162,41 +176,21 @@ public class GrilleModel extends AbstractGridInitiater{ return false; } - private void Player3(){ - switch(this.playerTurn){ - case Constants.PLAYER_ONE: - this.playerOneScore++; - break; - - case Constants.PLAYER_TWO: - this.playerTwoScore++; - break; - - case Constants.PLAYER_THREE: - this.playerThreeScore++; - break; - } - this.removePlayerPion(); - this.firePlayerChanged(this.playerTurn, this.grille); - this.tour.pollLast(); - this.switchPlayer(); - } /** - * Retourne true si 4 jetons de la même couleur ou plus sont alignés + * ReplayersListne true si 4 jetons de la même couleur ou plus sont alignés * @param numColumn La colonne où commencer * @param numRow La ligne où commencer * @param columnOffset l'offset de déplacement vertical * @param rowOffset l'offset de déplacement horizontal * @param playerColor La couleur du joueur (entier) - * @return Retourne true si 4 jetons ou plus sont alignés + * @return ReplayersListne true si 4 jetons ou plus sont alignés */ private boolean verifyAlignedPiece(int numColumn, int numRow, int columnOffset, int rowOffset, int playerColor) { int couleur = playerColor; int max = 0; int compteur = 0; - - if(this.tour.size() == 2) + if(this.playersList.size() == 2) max = Constants.ALIGNED_NUMBER_TWO; else max = Constants.ALIGNED_NUMBER_THREE; @@ -218,16 +212,16 @@ public class GrilleModel extends AbstractGridInitiater{ if(this.piecePlayed >= this.column * this.row) this.setPartyStatus(GameStatus.DRAW); } + /** - * Change le tour du joueur et notifie tous les listeners + * Change le playersList du joueur et notifie tous les listeners */ public void switchPlayer() { - this.playerTurn=(int)this.tour.pollFirst(); - this.tour.add((Integer)this.playerTurn); - + this.playerTurn=(int)this.playersList.remove(); + this.playersList.add((Integer)this.playerTurn); fireStatusChanged(this.gameStatus, this.playerTurn, this.playerOneScore, this.playerTwoScore, this.playerThreeScore); } - + /** * Change le status de la partie et notifie tous les listeners * @param gameStatus le status de la partie @@ -235,17 +229,21 @@ public class GrilleModel extends AbstractGridInitiater{ public void setPartyStatus(GameStatus gameStatus) { this.gameStatus = gameStatus; if(gameStatus == GameStatus.WIN) { - if(this.playerTurn == Constants.PLAYER_ONE) - playerOneScore++; - else if(this.playerTurn == Constants.PLAYER_TWO) - playerTwoScore++; - else - playerThreeScore++; + this.increaseScore(); } - fireStatusChanged(this.gameStatus, this.playerTurn, this.playerOneScore, this.playerTwoScore, this.playerThreeScore); } + + private void increaseScore() { + if(this.playerTurn == Constants.PLAYER_ONE) + playerOneScore++; + else if(this.playerTurn == Constants.PLAYER_TWO) + playerTwoScore++; + else + playerThreeScore++; + } + /** * retire les pions du joueur qui viens de gagner */ @@ -271,15 +269,15 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le tour du joueur - * @return Le tour du joueur + * ReplayersListne le playersList du joueur + * @return Le playersList du joueur */ public int getPlayerTurn() { return this.playerTurn; } /** - * Retourne le tableau d'entier qui représente l'état de la grille + * ReplayersListne le tableau d'entier qui représente l'état de la grille * @return Le tableau d'entier */ public int[][] getTab() { @@ -287,7 +285,7 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le nombre de colonne de la grille + * ReplayersListne le nombre de colonne de la grille * @return Le nombre de colonne */ public int getColumn() { @@ -295,7 +293,7 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le nombre de ligne de la grille + * ReplayersListne le nombre de ligne de la grille * @return Le nombre de ligne */ public int getRow() { @@ -303,7 +301,7 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le nom du joueur 1 + * ReplayersListne le nom du joueur 1 * @return Un string du nom du joueur 1 */ public String getPlayerOneName() { @@ -311,7 +309,7 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le nom du joueur 2 + * ReplayersListne le nom du joueur 2 * @return Un string du nom du joueur 2 */ public String getPlayerTwoName() { @@ -319,7 +317,7 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le nom du joueur 3 + * ReplayersListne le nom du joueur 3 * @return Un string du nom du joueur 2 */ public String getPlayerThreeName() { @@ -328,7 +326,7 @@ public class GrilleModel extends AbstractGridInitiater{ /** - * Retourne le score du joueur 1 + * ReplayersListne le score du joueur 1 * @return Le score du joueur 1 */ public int getPlayerOneScore() { @@ -336,7 +334,7 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le score du joueur 2 + * ReplayersListne le score du joueur 2 * @return Le score du joueur 2 */ public int getPlayerTwoScore() { @@ -344,7 +342,7 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le score du joueur 3 + * ReplayersListne le score du joueur 3 * @return Le score du joueur 3 */ public int getPlayerThreeScore() { @@ -352,7 +350,7 @@ public class GrilleModel extends AbstractGridInitiater{ } /** - * Retourne le {@link fr.iutfbleau.projetAgile.Puissance4.Utils.GameStatus status} de la partie + * ReplayersListne le {@link fr.iutfbleau.projetAgile.Puissance4.Utils.GameStatus status} de la partie * @return Le status de la partie */ public GameStatus getGameStatus() { @@ -360,7 +358,7 @@ public class GrilleModel extends AbstractGridInitiater{ } public int getPlayerNumber() { - return this.tour.size(); + return this.playersList.size(); } /** diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Model/package-info.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Model/package-info.java new file mode 100644 index 0000000..1c90547 --- /dev/null +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Model/package-info.java @@ -0,0 +1,5 @@ +/** + * fr.iutfbleau.projetAgile.Puissance4.Model groupe toutes les classes du modèle du Puissance 4 + */ +package fr.iutfbleau.projetAgile.Puissance4.Model; +//Fichier vide pour la javadoc \ No newline at end of file diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Utils/package-info.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Utils/package-info.java new file mode 100644 index 0000000..65aae92 --- /dev/null +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Utils/package-info.java @@ -0,0 +1,5 @@ +/** + * fr.iutfbleau.projetAgile.Puissance4.View groupe toutes les classes des paramètres/constantes du jeu + */ +package fr.iutfbleau.projetAgile.Puissance4.Utils; +//Fichier vide pour la javadoc \ No newline at end of file diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Puissance4Panel.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Puissance4Panel.java index 4f31f3b..9578c4b 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Puissance4Panel.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Puissance4Panel.java @@ -21,7 +21,6 @@ public class Puissance4Panel extends JPanel{ private String playerOneName; private String playerTwoName; private String playerThreeName; - private int playerNumber; /** * Crée un panneau avec la grille @@ -225,7 +224,7 @@ public class Puissance4Panel extends JPanel{ this.changeLabel(playerTurn); break; } - if(this.playerNumber == 2) + if(playerThreeScore == -1) this.changeScore(playerOneScore, playerTwoScore); else this.changeScore(playerOneScore, playerTwoScore, playerThreeScore); @@ -260,10 +259,6 @@ public class Puissance4Panel extends JPanel{ this.playerThreeName = playerThreeName; } - public void setPlayerNumber(int playerNumber) { - this.playerNumber = playerNumber; - } - /** * Retourne la grille du Puissance 4 * @return La grille du Puissance 4 diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/package-info.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/package-info.java new file mode 100644 index 0000000..094898e --- /dev/null +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/package-info.java @@ -0,0 +1,5 @@ +/** + * fr.iutfbleau.projetAgile.Puissance4.View groupe toutes les classes de la vue du Puissance 4 + */ +package fr.iutfbleau.projetAgile.Puissance4.View; +//Fichier vide pour la javadoc \ No newline at end of file