From 3f4f2fa25da7adb492d5350e5df95e6a1ea5a894 Mon Sep 17 00:00:00 2001 From: Justine Yannis Date: Sat, 15 Oct 2022 16:03:08 +0200 Subject: [PATCH] =?UTF-8?q?D=C3=A9placement=20de=20la=20m=C3=A9thode=20de?= =?UTF-8?q?=20v=C3=A9rification=20dans=20le=20mod=C3=A8le=20+=20fonction?= =?UTF-8?q?=20de=20test=20de=20reset=20de=20la=20grille?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/GrilleMouseListener.java | 79 +++------------ .../projetAgile/Model/GrilleModel.java | 95 ++++++++++++++++++- .../fr/iutfbleau/projetAgile/View/Grille.java | 10 ++ .../projetAgile/View/TestGrille.java | 7 +- 4 files changed, 119 insertions(+), 72 deletions(-) diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Controller/GrilleMouseListener.java b/projetAgile/src/fr/iutfbleau/projetAgile/Controller/GrilleMouseListener.java index 519795f..091cd28 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Controller/GrilleMouseListener.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Controller/GrilleMouseListener.java @@ -4,7 +4,6 @@ import java.awt.event.MouseEvent; import javax.swing.event.MouseInputAdapter; import fr.iutfbleau.projetAgile.Model.GrilleModel; import fr.iutfbleau.projetAgile.View.Grille; -import fr.iutfbleau.projetAgile.Utils.Constants; import static fr.iutfbleau.projetAgile.Utils.Constants.GameStatus.*; public class GrilleMouseListener extends MouseInputAdapter{ @@ -22,72 +21,18 @@ public class GrilleMouseListener extends MouseInputAdapter{ @Override public void mouseClicked(MouseEvent e) { - if(this.modele.getGameStatus() == PLAYING ) { - int column = (e.getX() * this.modele.getColumn() / grille.getWidth()); - this.verifyColumn(column); - } + if(e.getButton() == MouseEvent.BUTTON1) { + if(this.modele.getGameStatus() == PLAYING) { + int column = (e.getX() * this.modele.getColumn() / grille.getWidth()); + this.modele.verifyColumn(column); + } + } + //Seulement pour cas de test (Doit être modifié) + else { + this.modele.reset(); + this.grille.reset(); + } + } - protected void verifyColumn(int column) { - int[][] grille = this.modele.getTab(); - for (int row = this.modele.getRow() - 1; row >= 0; row--) { - if (grille[column][row] == Constants.EMPTY_PLAYER) { - this.modele.addPiece(column, row); - if(!this.verifyWin(column, row)) - this.modele.switchPlayer(); - return; - } - } - } - - protected boolean verifyWin(int column, int row) { - int playerColor = this.modele.getPlayerTurn(); - int diagonalColumn = column; - int diagonalRow = row; - - if(verifyAlignedPiece(column, 0, 0, 1, playerColor) || verifyAlignedPiece(0, row, 1, 0, playerColor)) { - this.modele.setPartyStatus(STOP); - return true; - } - - while(diagonalColumn > 0 && diagonalRow > 0) { - diagonalColumn--; - diagonalRow--; - } - if(verifyAlignedPiece(diagonalColumn, diagonalRow, 1, 1, playerColor)) { - this.modele.setPartyStatus(STOP); - return true; - } - - diagonalColumn = column; - diagonalRow = row; - while(diagonalColumn < this.modele.getColumn() - 1 && diagonalRow > 0) { - diagonalColumn++; - diagonalRow--; - } - if(verifyAlignedPiece(diagonalColumn, diagonalRow, -1, 1, playerColor)) { - this.modele.setPartyStatus(STOP); - return true; - } - - return false; - } - - private boolean verifyAlignedPiece(int numColumn, int numRow, int columnOffset, int rowOffset, int playerColor) { - int[][] grille = this.modele.getTab(); - int couleur = playerColor; - int compteur = 0; - while ((numColumn >= 0) && (numColumn < this.modele.getColumn()) && (numRow >= 0) && (numRow < this.modele.getRow())) { - if (grille[numColumn][numRow] != couleur) - compteur = 0; - else - compteur++; - if (compteur >= 4) - return true; - numColumn += columnOffset; - numRow += rowOffset; - } - return false; - } - } diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Model/GrilleModel.java b/projetAgile/src/fr/iutfbleau/projetAgile/Model/GrilleModel.java index b9dd3d9..8d7eb9d 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Model/GrilleModel.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Model/GrilleModel.java @@ -7,6 +7,7 @@ import fr.iutfbleau.projetAgile.Utils.Constants.GameStatus; public class GrilleModel extends AbstractGridInitiater{ private int[][] grille; private GameStatus gameStatus = GameStatus.PLAYING; + private int piecePlayed = 0; private int playerTurn; private int column, row; @@ -19,18 +20,109 @@ public class GrilleModel extends AbstractGridInitiater{ this.column = Constants.COLUMN_COUNT; this.row = Constants.ROW_COUNT; this.grille = new int[this.column][this.row]; + this.reset(); + } + //Fonction de test (pourra être modifié) + public void reset() { for(int i = 0; i < this.column; i++) { for(int j = 0; j < this.row; j++) { this.grille[i][j] = Constants.EMPTY_PLAYER; } } + this.playerTurn = Constants.PLAYER_ONE; + this.piecePlayed = 0; + this.setPartyStatus(GameStatus.PLAYING); } - public void addPiece(int column, int row) { + protected void addPiece(int column, int row) { grille[column][row] = this.playerTurn; fireGridChanged(column, row, this.playerTurn); } + 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)) + this.switchPlayer(); + this.verifyDraw(); + return; + } + } + } + + /** + * 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 + */ + protected boolean verifyWin(int column, int row) { + int playerColor = this.playerTurn; + int diagonalColumn = column; + int diagonalRow = row; + //Vérification horizontal et vertical + if(verifyAlignedPiece(column, 0, 0, 1, playerColor) || verifyAlignedPiece(0, row, 1, 0, playerColor)) { + this.setPartyStatus(GameStatus.STOP); + return true; + } + + while(diagonalColumn > 0 && diagonalRow > 0) { + diagonalColumn--; + diagonalRow--; + } + //Vérification diagonale haut à gauche -> bas à droite + if(verifyAlignedPiece(diagonalColumn, diagonalRow, 1, 1, playerColor)) { + this.setPartyStatus(GameStatus.STOP); + return true; + } + + diagonalColumn = column; + diagonalRow = row; + while(diagonalColumn < this.column - 1 && diagonalRow > 0) { + diagonalColumn++; + diagonalRow--; + } + + //Vérification diagonale haut à droite -> bas à gauche + if(verifyAlignedPiece(diagonalColumn, diagonalRow, -1, 1, playerColor)) { + this.setPartyStatus(GameStatus.STOP); + return true; + } + + return false; + } + + /** + * Retourne 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 + */ + private boolean verifyAlignedPiece(int numColumn, int numRow, int columnOffset, int rowOffset, int playerColor) { + int couleur = playerColor; + int compteur = 0; + while ((numColumn >= 0) && (numColumn < this.column) && (numRow >= 0) && (numRow < this.row)) { + if (grille[numColumn][numRow] != couleur) + compteur = 0; + else + compteur++; + if (compteur >= 4) + return true; + numColumn += columnOffset; + numRow += rowOffset; + } + return false; + } + + private void verifyDraw() { + if(this.piecePlayed >= this.column * this.row) + this.setPartyStatus(GameStatus.DRAW); + } + public void switchPlayer() { int oldPlayer = this.playerTurn; this.playerTurn = (this.playerTurn + 1) % 2; @@ -55,6 +147,7 @@ public class GrilleModel extends AbstractGridInitiater{ public void setPartyStatus(GameStatus gameStatus) { this.gameStatus = gameStatus; + //avertir un observateur } public GameStatus getGameStatus() { diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/View/Grille.java b/projetAgile/src/fr/iutfbleau/projetAgile/View/Grille.java index 862b30b..6411a6c 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/View/Grille.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/View/Grille.java @@ -71,4 +71,14 @@ public class Grille extends JPanel implements GridChangedListener{ System.out.println("Tour du joueur : " + (e.getNewPlayer() == Constants.PLAYER_ONE ? "Rouge" : "Jaune")); } + //Fonction de test (pourra être modifié) + public void reset() { + for (int x = 0; x < this.column; x++) { + for (int y = 0; y < this.row; y++) { + this.grille[x][y].setPlayer(Constants.EMPTY_PLAYER); + } + } + this.repaint(); + } + } \ No newline at end of file diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/View/TestGrille.java b/projetAgile/src/fr/iutfbleau/projetAgile/View/TestGrille.java index 4837eb8..6bdd201 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/View/TestGrille.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/View/TestGrille.java @@ -9,12 +9,11 @@ import fr.iutfbleau.projetAgile.Model.GrilleModel; public class TestGrille extends JFrame{ public TestGrille() { super("Puissance 4"); - - Puissance4Panel p = new Puissance4Panel(); - Grille g = p.getGrille(); + this.setLayout(new FlowLayout()); + Grille g = new Grille(); GrilleModel gm = new GrilleModel(); GrilleMouseListener listener = new GrilleMouseListener(g, gm); - this.add(p); + this.add(g); this.setLocation(200, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(new Dimension(1280,720));