2026-02-05 16:21:09 +01:00
|
|
|
|
package fr.iut_fbleau.Avalam;
|
|
|
|
|
|
|
|
|
|
|
|
import fr.iut_fbleau.GameAPI.Result;
|
|
|
|
|
|
|
|
|
|
|
|
import javax.swing.*;
|
|
|
|
|
|
import java.awt.*;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Fenêtre de fin de partie.
|
2026-02-05 16:24:56 +01:00
|
|
|
|
*
|
|
|
|
|
|
* 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.
|
2026-02-05 16:21:09 +01:00
|
|
|
|
*/
|
|
|
|
|
|
public class EndGameDialog extends JDialog {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Construit la fenêtre de fin de partie.
|
|
|
|
|
|
*
|
2026-02-05 16:24:56 +01:00
|
|
|
|
* @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 »
|
2026-02-05 16:21:09 +01:00
|
|
|
|
*/
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|