161 lines
5.4 KiB
Java
161 lines
5.4 KiB
Java
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();
|
||
}
|
||
}
|
||
}
|
||
|
||
|