From 88d00f4f50eda621d2ef4383e9909b8a3b84a9b6 Mon Sep 17 00:00:00 2001 From: Justine Yannis Date: Tue, 25 Oct 2022 13:53:01 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20commentaire=20et=20simplication=20de=20?= =?UTF-8?q?l'algo=20de=20survol=20des=20pions=20en=20sauvegardant=20le=20d?= =?UTF-8?q?ernier=20pion=20survol=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projetAgile/Makefile | 8 +- .../Controller/ModelEventListener.java | 1 + .../Controller/Puissance4Controller.java | 6 +- .../projetAgile/Puissance4/View/Grille.java | 82 +++++++++++++++---- .../projetAgile/Puissance4/View/Pion.java | 30 +++++-- .../Puissance4/View/Puissance4Panel.java | 13 ++- 6 files changed, 110 insertions(+), 30 deletions(-) diff --git a/projetAgile/Makefile b/projetAgile/Makefile index 6b2dde2..ff57c66 100644 --- a/projetAgile/Makefile +++ b/projetAgile/Makefile @@ -57,7 +57,7 @@ build/$(PACKAGE_PATH)/Puissance4/Controller/ResetGame.class : src/$(PACKAGE_PATH build/$(PACKAGE_PATH)/Puissance4/Controller/GrilleMouseListener.class : src/$(PACKAGE_PATH)/Puissance4/Controller/GrilleMouseListener.java @javac $(@JAVAC_OPT) $< -build/$(PACKAGE_PATH)/Menu/Controller/ModelEventListener.class : src/$(PACKAGE_PATH)/Menu/Controller/ModelEventListener.java \ +build/$(PACKAGE_PATH)/Puissance4/Controller/ModelEventListener.class : src/$(PACKAGE_PATH)/Puissance4/Controller/ModelEventListener.java \ build/$(PACKAGE_PATH)/Puissance4/Event/GridChangedListener.class \ build/$(PACKAGE_PATH)/Puissance4/View/Grille.class \ $(Event) @@ -123,11 +123,7 @@ build/$(PACKAGE_PATH)/Menu/View/Menu.class : src/$(PACKAGE_PATH)/Menu/View/Menu. build/$(PACKAGE_PATH)/Main.class : src/$(PACKAGE_PATH)/Main.java \ - build/$(PACKAGE_PATH)/Menu/View/Menu.class \ - build/$(PACKAGE_PATH)/Puissance4/Controller/Puissance4Controller.class \ - build/$(PACKAGE_PATH)/Puissance4/View/Grille.class \ - build/$(PACKAGE_PATH)/Puissance4/Model/GrilleModel.class \ - build/$(PACKAGE_PATH)/Puissance4/LancementPartie.class + build/$(PACKAGE_PATH)/Menu/View/Menu.class @echo "Classes compiled" @javac $(@JAVAC_OPT) $< diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/ModelEventListener.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/ModelEventListener.java index b944435..c480072 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/ModelEventListener.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/ModelEventListener.java @@ -19,6 +19,7 @@ public class ModelEventListener implements GridChangedListener { @Override public void playerChanged(StatusEvent e) { this.panel.changeLabel(e.getPlayerTurn()); + this.panel.changeHoverColor(e.getPlayerTurn()); } @Override diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/Puissance4Controller.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/Puissance4Controller.java index 8750606..9fabe8f 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/Puissance4Controller.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/Controller/Puissance4Controller.java @@ -40,6 +40,7 @@ public class Puissance4Controller { public void initPanel() { this.panel.init(); + this.panel.changeHoverColor(this.modele.getPlayerTurn()); this.panel.changeLabel(this.modele.getPlayerTurn()); } @@ -50,6 +51,7 @@ public class Puissance4Controller { } this.grille.reset(); this.modele.reset(); + this.panel.changeHoverColor(this.modele.getPlayerTurn()); this.panel.changeLabel(this.modele.getPlayerTurn()); } @@ -63,11 +65,11 @@ public class Puissance4Controller { public void hoverGrille(int x) { if(this.modele.getGameStatus() == GameStatus.PLAYING) { if(x == -1) { - this.grille.hover(-1, this.modele.getPlayerTurn()); //Clean + this.grille.hover(-1); //Clean return; } int column = (x * this.modele.getColumn() / grille.getWidth()); - this.grille.hover(column, this.modele.getPlayerTurn()); + this.grille.hover(column); } } diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Grille.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Grille.java index 5f3d8f8..66d603a 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Grille.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Grille.java @@ -4,20 +4,32 @@ import javax.swing.*; import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants; import java.awt.*; +/** + * Classe qui représente uniquement la grille du puissance 4 + */ public class Grille extends JPanel{ private Pion grille[][]; private int column; private int row; + private Pion lastHoveredPion; + /** + * Crée un grille vide + */ public Grille() { super(); } + /** + * Initialise la grille avec le panneau donné en argument + * @param tab le tableau contenant la position des pions de chaque joueur + */ public void init(int[][] tab) { this.column = Constants.COLUMN_COUNT; this.row = Constants.ROW_COUNT; this.grille = new Pion[this.column][this.row]; + this.lastHoveredPion = null; this.setBackground(new Color(31,31,31)); /* * On peut remplacer GridBagLayout par un GridLayout @@ -45,13 +57,20 @@ public class Grille extends JPanel{ } } - + /** + * Change le propriétaire d'un pion et le redessine + * @param column la colonne du pion a changer + * @param row la ligne du pion a changer + * @param player le joueur + */ public void addPlayerPiece(int column, int row, int player) { this.grille[column][row].setPlayer(player); this.grille[column][row].repaint(); } - //Fonction de test (pourra être modifié) + /** + * Réinitialise la grille et la rempli de pion "vide" + */ public void reset() { for (int x = 0; x < this.column; x++) { for (int y = 0; y < this.row; y++) { @@ -62,20 +81,53 @@ public class Grille extends JPanel{ this.repaint(); } - public void hover(int column, int player) { - Pion.setHighlightColor(player == Constants.PLAYER_ONE ? Constants.PLAYER_ONE_COLOR : Constants.PLAYER_TWO_COLOR ); - boolean found = false; - for(int x = 0; x < this.column; x++) { - for(int y = this.row - 1; y >= 0; y--) { - this.grille[x][y].setHover(false); - this.grille[x][y].repaint(); //On utilise un peu moins de CPU à redessiner uniquement chaque pion - if(!found && x == column && this.grille[column][y].getPlayer() == Constants.EMPTY_PLAYER) { - this.grille[column][y].setHover(true); - this.grille[x][y].repaint(); //On utilise un peu moins de CPU à redessiner uniquement chaque pion - found = true; + /** + * Change la couleur de survol des pions selon le tour du joueur + * @param player le joueur qui joue + */ + public void changeHoverColor(int player) { + Color c; + switch(player) { + case Constants.PLAYER_ONE : + c = new Color(Constants.PLAYER_ONE_COLOR.getRed(), Constants.PLAYER_ONE_COLOR.getGreen(), Constants.PLAYER_ONE_COLOR.getBlue(), 100); + break; + case Constants.PLAYER_TWO : + c = new Color(Constants.PLAYER_TWO_COLOR.getRed(), Constants.PLAYER_TWO_COLOR.getGreen(), Constants.PLAYER_TWO_COLOR.getBlue(), 100); + break; + default : + c = Color.BLACK; + } + Pion.setHighlightColor(c); + } + + /** + * Sélectionne le pion qui doit être afficher comme survolé selon la colonne + * @param column la colonne survolé + */ + public void hover(int column) { + if(column == -1) { + if(this.lastHoveredPion != null) { + this.lastHoveredPion.setHover(false); + this.lastHoveredPion.repaint(); + this.lastHoveredPion = null; + } + } + else { + for(int y = row - 1; y > 0; y--) { + if(this.grille[column][y].getPlayer() == Constants.EMPTY_PLAYER) { + if(this.grille[column][y] != this.lastHoveredPion) { + if(this.lastHoveredPion != null) { + this.lastHoveredPion.setHover(false); + this.lastHoveredPion.repaint(); + } + this.lastHoveredPion = this.grille[column][y]; + this.lastHoveredPion.setHover(true); + this.lastHoveredPion.repaint(); + break; + } + else + break; } - if(this.grille[x][y].getPlayer() == Constants.EMPTY_PLAYER) //Si on est sur un pion vide on passe à la colonne suivante (économise des calculs lorsque grille quasiment vide) - break; } } } diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Pion.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Pion.java index f632538..7dbc178 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Pion.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Pion.java @@ -4,7 +4,9 @@ import java.awt.*; import javax.swing.*; import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants; - +/** + * Classe qui représente un pion + */ public class Pion extends JComponent{ private static Color HIGHLIGHT_COLOR = null; @@ -23,25 +25,41 @@ public class Pion extends JComponent{ return new Dimension(120,120); } + /** + * Crée un pion + * @param player a qui appartient le pion + */ public Pion(int player) { this.setMinimumSize(new Dimension(80,80)); this.setMaximumSize(new Dimension(150,150)); this.setPreferredSize(new Dimension(120,120)); this.player = player; } - + /** + * Change le "propriétaire" du pion + * @param player + */ public void setPlayer(int player) { this.player = player; } - + /** + * Indique le pion est survolé + * @param b un booléen + */ public void setHover(boolean b) { this.hover = b; } - + /** + * Retourne le "priopriétaire" du pion + * @return le joueur propriétaire du pion + */ public int getPlayer() { return this.player; } - + /** + * Set la couleur de survol d'un pion + * @param c + */ public static void setHighlightColor(Color c) { Pion.HIGHLIGHT_COLOR = c; } @@ -63,7 +81,7 @@ public class Pion extends JComponent{ break; } if(this.hover) { - g2.setColor(new Color(Pion.HIGHLIGHT_COLOR.getRed(),Pion.HIGHLIGHT_COLOR.getGreen(),Pion.HIGHLIGHT_COLOR.getBlue(), 100)); + g2.setColor(Pion.HIGHLIGHT_COLOR); g2.fillOval(Constants.PIECE_MARGIN, Constants.PIECE_MARGIN, this.getWidth() - 2 * Constants.PIECE_MARGIN, this.getHeight() - 2 * Constants.PIECE_MARGIN); } else { diff --git a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Puissance4Panel.java b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Puissance4Panel.java index 599f1f7..4832b27 100644 --- a/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Puissance4Panel.java +++ b/projetAgile/src/fr/iutfbleau/projetAgile/Puissance4/View/Puissance4Panel.java @@ -8,6 +8,9 @@ import fr.iutfbleau.projetAgile.Puissance4.Utils.GameStatus; import java.awt.*; import java.awt.event.ActionListener; +/** + * Classe qui représente le panneau du puissance 4, avec la grille, le tour du joueur, les boutons, et le score. + */ public class Puissance4Panel extends JPanel{ private JButton reset; @@ -17,6 +20,10 @@ public class Puissance4Panel extends JPanel{ private String playerOneName; private String playerTwoName; + /** + * Crée un panneau avec la grille + * @param grille la grille à afficher + */ public Puissance4Panel(Grille grille) { super(); this.reset = new JButton("RECOMMENCER"); @@ -119,6 +126,10 @@ public class Puissance4Panel extends JPanel{ this.menu.addActionListener(l); } + public void changeHoverColor(int player) { + this.grille.changeHoverColor(player); + } + public void changeLabel(int joueur) { switch(joueur){ case Constants.PLAYER_ONE: @@ -140,7 +151,7 @@ public class Puissance4Panel extends JPanel{ } public void setGameStatus(GameStatus status, int playerTurn, int playerOneScore, int playerTwoScore) { - this.grille.hover(-1, playerTurn); + this.grille.hover(-1); switch(status){ case WIN: this.label.setText("Victoire de : " + (playerTurn == Constants.PLAYER_ONE ? this.playerOneName : this.playerTwoName));