import javax.swing.*; import java.awt.*; /** * Fenêtre principale pendant une partie de Démineur. */ public class FenetreJeu extends JFrame { private Grille grille; private JButton[][] boutons; public FenetreJeu(Grille g) { super("Démineur - Partie en cours"); this.grille = g; this.boutons = new JButton[g.getLignes()][g.getColonnes()]; this.setSize(600, 600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); JPanel panneauGrille = new JPanel(); panneauGrille.setLayout(new GridLayout(g.getLignes(), g.getColonnes())); ControleurGrille controleurSouris = new ControleurGrille(this, this.grille); for (int i = 0; i < g.getLignes(); i++) { for (int j = 0; j < g.getColonnes(); j++) { JButton boutonCase = new JButton(""); this.boutons[i][j] = boutonCase; panneauGrille.add(boutonCase); boutonCase.addMouseListener(controleurSouris); } } this.add(panneauGrille, BorderLayout.CENTER); JButton btnSauverQuitter = new JButton("Sauver et Quitter"); this.add(btnSauverQuitter, BorderLayout.SOUTH); ControleurJeu controleurQuitter = new ControleurJeu(this); btnSauverQuitter.addActionListener(controleurQuitter); } 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); } } } /** * 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 } } } } // <--- L'accolade finale est bien ici maintenant !