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