package fr.iut_fbleau.Avalam; import fr.iut_fbleau.GameAPI.Result; import javax.swing.*; import java.awt.*; /** * Fenêtre de fin de partie. * * Elle est ouverte par {@link AvalamWindow} lorsque le moteur signale * que la partie est terminée. Elle affiche : * - le résultat (gagnant ou égalité) à partir du {@link Result} ; * - le score détaillé (tours contrôlées par Jaune et Rouge) ; * - le mode de jeu courant (PVP, PVBOT, PVALPHA, PVGOD, avec profondeur pour les bots intelligents). * * Elle propose également trois actions sous forme de boutons : * - « Rejouer » : relancer une partie avec la même configuration ; * - « Menu principal » : retourner au menu de sélection de mode ; * - « Quitter » : fermer complètement l’application. */ public class EndGameDialog extends JDialog { /** * Construit la fenêtre de fin de partie. * * @param parent fenêtre principale (généralement une {@link AvalamWindow}) * @param result résultat de la partie (WIN / LOSS / DRAW du point de vue de PLAYER1 / Jaune) * @param scoreJaune score du joueur jaune (nombre de tours contrôlées) * @param scoreRouge score du joueur rouge (nombre de tours contrôlées) * @param mode mode de jeu courant (pour l’information et le « Rejouer ») * @param depth profondeur utilisée (pour les modes avec bot intelligent) * @param onReplay action à exécuter lorsque l’utilisateur clique sur « Rejouer » * @param onMenu action à exécuter lorsque l’utilisateur clique sur « Menu principal » * @param onQuit action à exécuter lorsque l’utilisateur clique sur « Quitter » */ 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(); } } }