From 88c65bc194754318c79a42f5b22e39ed6b2b3d69 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Thu, 5 Feb 2026 16:21:09 +0100 Subject: [PATCH] ajout d'un menu de fin et de pouvoir quitter --- fr/iut_fbleau/Avalam/ArenaWindow.java | 24 +++- fr/iut_fbleau/Avalam/AvalamWindow.java | 46 +++---- fr/iut_fbleau/Avalam/EndGameDialog.java | 153 ++++++++++++++++++++++++ 3 files changed, 198 insertions(+), 25 deletions(-) create mode 100644 fr/iut_fbleau/Avalam/EndGameDialog.java diff --git a/fr/iut_fbleau/Avalam/ArenaWindow.java b/fr/iut_fbleau/Avalam/ArenaWindow.java index f6d0580..b33fb76 100644 --- a/fr/iut_fbleau/Avalam/ArenaWindow.java +++ b/fr/iut_fbleau/Avalam/ArenaWindow.java @@ -55,14 +55,19 @@ public class ArenaWindow extends JFrame { JButton startButton = new JButton("Lancer les parties"); startButton.addActionListener(e -> showConfigDialog()); buttonPanel.add(startButton); - + JButton backButton = new JButton("Retour au menu"); backButton.addActionListener(e -> { dispose(); // Ferme la fenêtre Arène Main.showModeSelection(); // Affiche le menu principal }); buttonPanel.add(backButton); - + + // Nouveau bouton pour quitter entièrement le jeu + JButton quitButton = new JButton("Quitter"); + quitButton.addActionListener(e -> System.exit(0)); + buttonPanel.add(quitButton); + add(buttonPanel, BorderLayout.SOUTH); pack(); @@ -226,13 +231,22 @@ public class ArenaWindow extends JFrame { } } - // Afficher un message de fin - JOptionPane.showMessageDialog( + // Afficher un message de fin avec possibilité de quitter directement + Object[] options = {"OK", "Quitter le jeu"}; + int choice = JOptionPane.showOptionDialog( this, "Toutes les parties sont terminées !", "Arène terminée", - JOptionPane.INFORMATION_MESSAGE + JOptionPane.DEFAULT_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + options, + options[0] ); + + if (choice == 1) { + System.exit(0); + } } /** diff --git a/fr/iut_fbleau/Avalam/AvalamWindow.java b/fr/iut_fbleau/Avalam/AvalamWindow.java index 1497478..fa8a6a1 100644 --- a/fr/iut_fbleau/Avalam/AvalamWindow.java +++ b/fr/iut_fbleau/Avalam/AvalamWindow.java @@ -50,6 +50,9 @@ public class AvalamWindow extends JFrame { /** Mode de jeu sélectionné. */ private final GameMode mode; + /** Profondeur de recherche utilisée (utile pour les modes avec bot intelligent et pour rejouer). */ + private final int searchDepth; + /** Joueur contrôlé par le bot (si actif). */ private final Player botPlayer = Player.PLAYER2; @@ -104,10 +107,11 @@ public class AvalamWindow extends JFrame { super("Avalam"); this.mode = mode; + this.searchDepth = Math.max(1, alphaDepth); this.idiotBot = (mode == GameMode.PVBOT) ? new IdiotBot(botPlayer) : null; - int depth = Math.max(1, alphaDepth); + int depth = this.searchDepth; this.alphaBot = (mode == GameMode.PVALPHA) ? new AlphaBetaBot(botPlayer, depth) : null; // A FAIRE PLUS TARD (PVGOD) @@ -169,28 +173,30 @@ public class AvalamWindow extends JFrame { if (board.isGameOver()) { Result res = board.getResult(); - String msg; - switch (res) { - case WIN: - msg = "Le joueur jaune a gagné !"; - break; - case LOSS: - msg = "Le joueur rouge a gagné !"; - break; - case DRAW: - msg = "Égalité !"; - break; - default: - msg = "Fin de partie."; - break; - } + int scoreJaune = computeScore(Color.YELLOW); + int scoreRouge = computeScore(Color.RED); - JOptionPane.showMessageDialog( + EndGameDialog dialog = new EndGameDialog( this, - msg, - "Partie terminée", - JOptionPane.INFORMATION_MESSAGE + res, + scoreJaune, + scoreRouge, + mode, + searchDepth, + // Rejouer : on ferme la fenêtre actuelle et on relance une nouvelle partie avec le même mode/profondeur + () -> SwingUtilities.invokeLater(() -> { + dispose(); + new AvalamWindow(mode, searchDepth); + }), + // Menu principal : on ferme la fenêtre actuelle et on réaffiche le menu de mode de jeu + () -> SwingUtilities.invokeLater(() -> { + dispose(); + Main.showModeSelection(); + }), + // Quitter complètement l'application + () -> System.exit(0) ); + dialog.setVisible(true); return; } diff --git a/fr/iut_fbleau/Avalam/EndGameDialog.java b/fr/iut_fbleau/Avalam/EndGameDialog.java new file mode 100644 index 0000000..55cbd87 --- /dev/null +++ b/fr/iut_fbleau/Avalam/EndGameDialog.java @@ -0,0 +1,153 @@ +package fr.iut_fbleau.Avalam; + +import fr.iut_fbleau.GameAPI.Result; + +import javax.swing.*; +import java.awt.*; + +/** + * Fenêtre de fin de partie. + * Affiche le gagnant, le score et propose plusieurs actions : + * - Rejouer la même configuration + * - Retour au menu principal + * - Quitter le jeu + */ +public class EndGameDialog extends JDialog { + + /** + * Construit la fenêtre de fin de partie. + * + * @param parent fenêtre principale (AvalamWindow) + * @param result résultat de la partie (WIN / LOSS / DRAW du point de vue de PLAYER1 / Jaune) + * @param scoreJaune score du joueur jaune + * @param scoreRouge score du joueur rouge + * @param mode mode de jeu courant (pour l'information / le rejouer) + * @param depth profondeur utilisée (pour les modes avec bot intelligent) + * @param onReplay action à exécuter pour rejouer + * @param onMenu action à exécuter pour revenir au menu + * @param onQuit action à exécuter pour quitter l'application + */ + public EndGameDialog( + JFrame parent, + Result result, + int scoreJaune, + int scoreRouge, + GameMode mode, + int depth, + Runnable onReplay, + Runnable onMenu, + Runnable onQuit + ) { + super(parent, "Fin de partie", true); + + setLayout(new BorderLayout(10, 10)); + + // Panel principal d'information + JPanel infoPanel = new JPanel(); + infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.Y_AXIS)); + infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + + JLabel titre = new JLabel("Partie terminée"); + titre.setFont(titre.getFont().deriveFont(Font.BOLD, 18f)); + titre.setAlignmentX(Component.CENTER_ALIGNMENT); + + String gagnant; + switch (result) { + case WIN: + gagnant = "Le joueur JAUNE a gagné !"; + break; + case LOSS: + gagnant = "Le joueur ROUGE a gagné !"; + break; + case DRAW: + gagnant = "Égalité parfaite !"; + break; + default: + gagnant = "Fin de partie."; + } + + JLabel gagnantLabel = new JLabel(gagnant); + gagnantLabel.setAlignmentX(Component.CENTER_ALIGNMENT); + + JLabel scoreLabel = new JLabel( + "Score - Jaune : " + scoreJaune + " | Rouge : " + scoreRouge + ); + scoreLabel.setAlignmentX(Component.CENTER_ALIGNMENT); + + JLabel modeLabel = new JLabel("Mode : " + modeToString(mode, depth)); + modeLabel.setAlignmentX(Component.CENTER_ALIGNMENT); + + infoPanel.add(titre); + infoPanel.add(Box.createVerticalStrut(10)); + infoPanel.add(gagnantLabel); + infoPanel.add(Box.createVerticalStrut(5)); + infoPanel.add(scoreLabel); + infoPanel.add(Box.createVerticalStrut(5)); + infoPanel.add(modeLabel); + + add(infoPanel, BorderLayout.CENTER); + + // Panel des boutons d'action + JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 15, 10)); + + JButton replayButton = new JButton("Rejouer"); + replayButton.addActionListener(e -> { + if (onReplay != null) { + onReplay.run(); + } + dispose(); + }); + + JButton menuButton = new JButton("Menu principal"); + menuButton.addActionListener(e -> { + if (onMenu != null) { + onMenu.run(); + } + dispose(); + }); + + JButton quitButton = new JButton("Quitter"); + quitButton.addActionListener(e -> { + if (onQuit != null) { + onQuit.run(); + } + dispose(); + }); + + buttonPanel.add(replayButton); + buttonPanel.add(menuButton); + buttonPanel.add(quitButton); + + add(buttonPanel, BorderLayout.SOUTH); + + pack(); + setResizable(false); + setLocationRelativeTo(parent); + } + + /** + * Retourne une description lisible du mode de jeu courant. + * + * @param mode mode de jeu + * @param depth profondeur (pour les bots intelligents) + * @return chaîne décrivant le mode + */ + private String modeToString(GameMode mode, int depth) { + switch (mode) { + case PVP: + return "Joueur vs Joueur"; + case PVBOT: + return "Joueur vs Bot idiot"; + case PVALPHA: + return "Joueur vs Bot Alpha (profondeur " + depth + ")"; + case PVGOD: + return "Joueur vs Bot Divin (profondeur " + depth + ")"; + case ARENA: + return "Arène (bots)"; // normalement non utilisé ici + default: + return mode.name(); + } + } +} + +