2026-03-30 22:33:20 +02:00
|
|
|
import javax.swing.*;
|
|
|
|
|
import java.awt.*;
|
|
|
|
|
|
2026-04-03 18:41:45 +02:00
|
|
|
/**
|
|
|
|
|
* Fenêtre principale pendant une partie de Démineur.
|
|
|
|
|
*/
|
2026-03-30 22:33:20 +02:00
|
|
|
public class FenetreJeu extends JFrame {
|
|
|
|
|
|
|
|
|
|
private Grille grille;
|
2026-04-03 18:41:45 +02:00
|
|
|
private JButton[][] boutons;
|
2026-03-30 22:33:20 +02:00
|
|
|
|
|
|
|
|
public FenetreJeu(Grille g) {
|
|
|
|
|
super("Démineur - Partie en cours");
|
|
|
|
|
this.grille = g;
|
2026-04-03 18:41:45 +02:00
|
|
|
this.boutons = new JButton[g.getLignes()][g.getColonnes()];
|
2026-03-30 22:33:20 +02:00
|
|
|
|
|
|
|
|
this.setSize(600, 600);
|
|
|
|
|
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
|
|
|
this.setLayout(new BorderLayout());
|
|
|
|
|
|
|
|
|
|
JPanel panneauGrille = new JPanel();
|
2026-04-03 16:56:08 +02:00
|
|
|
panneauGrille.setLayout(new GridLayout(g.getLignes(), g.getColonnes()));
|
2026-03-30 22:33:20 +02:00
|
|
|
|
2026-04-03 18:41:45 +02:00
|
|
|
ControleurGrille controleurSouris = new ControleurGrille(this, this.grille);
|
|
|
|
|
|
2026-04-03 16:56:08 +02:00
|
|
|
for (int i = 0; i < g.getLignes(); i++) {
|
|
|
|
|
for (int j = 0; j < g.getColonnes(); j++) {
|
2026-04-03 18:41:45 +02:00
|
|
|
JButton boutonCase = new JButton("");
|
|
|
|
|
this.boutons[i][j] = boutonCase;
|
2026-03-30 22:33:20 +02:00
|
|
|
panneauGrille.add(boutonCase);
|
2026-04-03 18:41:45 +02:00
|
|
|
|
|
|
|
|
boutonCase.addMouseListener(controleurSouris);
|
2026-03-30 22:33:20 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.add(panneauGrille, BorderLayout.CENTER);
|
2026-04-03 16:56:08 +02:00
|
|
|
|
|
|
|
|
JButton btnSauverQuitter = new JButton("Sauver et Quitter");
|
|
|
|
|
this.add(btnSauverQuitter, BorderLayout.SOUTH);
|
2026-04-03 18:41:45 +02:00
|
|
|
ControleurJeu controleurQuitter = new ControleurJeu(this);
|
|
|
|
|
btnSauverQuitter.addActionListener(controleurQuitter);
|
2026-03-30 22:33:20 +02:00
|
|
|
}
|
2026-04-03 18:41:45 +02:00
|
|
|
|
|
|
|
|
public JButton getBouton(int l, int c) {
|
|
|
|
|
return this.boutons[l][c];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Met à jour le visuel d'un bouton en fonction de l'état de sa Case logique.
|
|
|
|
|
*/
|
|
|
|
|
public void rafraichirCase(int l, int c) {
|
|
|
|
|
Case caseLogique = this.grille.getCase(l, c);
|
|
|
|
|
JButton btn = this.boutons[l][c];
|
|
|
|
|
|
|
|
|
|
if (caseLogique.isRevelee()) {
|
|
|
|
|
btn.setEnabled(false);
|
|
|
|
|
|
|
|
|
|
if (caseLogique.isMinee()) {
|
|
|
|
|
btn.setText("M");
|
|
|
|
|
btn.setBackground(Color.RED);
|
|
|
|
|
} else if (caseLogique.getNbMinesVoisines() > 0) {
|
|
|
|
|
btn.setText("" + caseLogique.getNbMinesVoisines());
|
|
|
|
|
} else {
|
|
|
|
|
btn.setText("");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (caseLogique.getMarqueur() == 1) {
|
|
|
|
|
btn.setText("★");
|
|
|
|
|
} else if (caseLogique.getMarqueur() == 2) {
|
|
|
|
|
btn.setText("?");
|
|
|
|
|
} else {
|
|
|
|
|
btn.setText("");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Rafraîchit l'affichage de tous les boutons de la grille d'un seul coup.
|
|
|
|
|
* Indispensable après une réaction en chaîne.
|
|
|
|
|
*/
|
|
|
|
|
public void rafraichirTouteLaGrille() {
|
|
|
|
|
for (int i = 0; i < grille.getLignes(); i++) {
|
|
|
|
|
for (int j = 0; j < grille.getColonnes(); j++) {
|
|
|
|
|
rafraichirCase(i, j);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-07 13:54:01 +02:00
|
|
|
/**
|
|
|
|
|
* Affiche la grille de fin de partie en cas de défaite, comme demandé dans le sujet.
|
|
|
|
|
* @param lExplose la ligne de la mine qui a fait BOUM
|
|
|
|
|
* @param cExplose la colonne de la mine qui a fait BOUM
|
|
|
|
|
*/
|
|
|
|
|
public void afficherDefaite(int lExplose, int cExplose) {
|
|
|
|
|
for (int i = 0; i < grille.getLignes(); i++) {
|
|
|
|
|
for (int j = 0; j < grille.getColonnes(); j++) {
|
|
|
|
|
|
|
|
|
|
Case c = grille.getCase(i, j);
|
|
|
|
|
JButton btn = boutons[i][j];
|
|
|
|
|
|
|
|
|
|
// On désactive le bouton pour empêcher de cliquer dessus
|
|
|
|
|
btn.setEnabled(false);
|
|
|
|
|
|
|
|
|
|
// 1. La case dont la mine a "sauté"
|
|
|
|
|
if (i == lExplose && j == cExplose) {
|
|
|
|
|
btn.setText("BOUM");
|
|
|
|
|
btn.setBackground(Color.RED);
|
|
|
|
|
}
|
|
|
|
|
// 2. Les cases minées non marquées (les bombes oubliées)
|
|
|
|
|
else if (c.isMinee() && c.getMarqueur() != 1) {
|
|
|
|
|
btn.setText("M");
|
|
|
|
|
btn.setBackground(Color.ORANGE);
|
|
|
|
|
}
|
|
|
|
|
// 3. Les cases marquées non minées (les fausses pistes)
|
|
|
|
|
else if (!c.isMinee() && c.getMarqueur() == 1) {
|
|
|
|
|
btn.setText("X"); // Un X pour dire "Erreur"
|
|
|
|
|
btn.setBackground(Color.YELLOW);
|
|
|
|
|
}
|
|
|
|
|
// Si la case ne rentre pas dans ces cas, on la laisse tranquille
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-03 18:41:45 +02:00
|
|
|
} // <--- L'accolade finale est bien ici maintenant !
|