Vérification après la première victoire + regroupement de code dans fonctions

This commit is contained in:
Justine Yannis 2022-11-11 19:59:23 +01:00
parent 7a1d8aadac
commit e688fb131a
13 changed files with 138 additions and 109 deletions

View File

@ -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) $<

View File

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

View File

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

View File

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

View File

@ -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());
}

View File

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

View File

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

View File

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

View File

@ -21,7 +21,7 @@ public class GrilleModel extends AbstractGridInitiater{
private int playerOneScore;
private int playerTwoScore;
private int playerThreeScore;
private LinkedList<Integer> tour;
private LinkedList<Integer> 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<Integer>();
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<Integer>();
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<Integer>();
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 commencer
* @param numRow La ligne 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();
}
/**

View File

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

View File

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

View File

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

View File

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