import java.util.Random; import java.io.Serializable; /** * Représente la grille complète du jeu de Démineur. * Gère le placement aléatoire des mines et le calcul des cases voisines. */ public class Grille implements Serializable { private Case[][] grille; private int ligne, colonne; private Random generateur = new Random(); private int nbMinesTotales; /** * Construit une nouvelle grille vide avec les dimensions spécifiées. * @param ligne Le nombre de lignes de la grille. * @param colonne Le nombre de colonnes de la grille. */ public Grille(int ligne, int colonne) { this.ligne = ligne; this.colonne = colonne; this.grille = new Case[ligne][colonne]; for(int i = 0; i < ligne; i++) { for(int j = 0; j < colonne; j++) { this.grille[i][j] = new Case(); } } } /** * Place un nombre de mines aléatoirement dans la grille. * @param nbMines Le nombre total de mines à cacher. */ public void placerMines(int nbMines) { this.nbMinesTotales = nbMines; int randomLigne, randomColonne; for(int i = 0; i < nbMines; i++) { randomLigne = generateur.nextInt(ligne); randomColonne = generateur.nextInt(colonne); if (grille[randomLigne][randomColonne].getEstMinee() == true) { i--; // On recommence si la case a déjà une mine } else { grille[randomLigne][randomColonne].setEstMinee(true); } } } /** * @return Le nombre total de mines présentes dans la grille. */ public int getNbMinesTotales() { return nbMinesTotales; } /** * Compte le nombre de mines autour d'une case spécifique et met à jour cette case. * @param l L'index de la ligne de la case. * @param c L'index de la colonne de la case. */ public void compterMinesVoisines(int l, int c) { int compteur = 0; for(int i = -1; i <= 1; i++) { for(int j = -1; j <= 1; j++) { int vL = l + i; int vC = c + j; // Vérifie que l'on ne sort pas des limites du tableau if(vL >= 0 && vL < ligne && vC >= 0 && vC < colonne) { if (grille[vL][vC].getEstMinee()) { compteur++; } } } } grille[l][c].setNbMinesautour(compteur); } /** * Parcourt toute la grille pour calculer les mines voisines de chaque case. */ public void calculerToutesLesMines() { for(int i = 0; i < ligne; i++) { for(int j = 0; j < colonne; j++) { compterMinesVoisines(i, j); } } } /** @return Le nombre de lignes de la grille. */ public int getLigne() { return ligne; } /** @return Le nombre de colonnes de la grille. */ public int getColonne() { return colonne; } /** * Récupère l'objet Case à une position spécifique. * @param l L'index de la ligne. * @param c L'index de la colonne. * @return L'objet Case correspondant. */ public Case getCase(int l, int c) { return grille[l][c]; } }