import java.io.Serializable; import java.util.Random; /** * Représente le plateau de jeu contenant les cases. */ public class Grille implements Serializable { private Case[][] plateau; private int lignes; private int colonnes; private int mines; private boolean partieTerminee; // <--- LE FAMEUX VERROU ! public Grille(int l, int c, int m) { this.lignes = l; this.colonnes = c; this.mines = m; this.partieTerminee = false; this.plateau = new Case[this.lignes][this.colonnes]; for (int i = 0; i < this.lignes; i++) { for (int j = 0; j < this.colonnes; j++) { this.plateau[i][j] = new Case(); } } placerMines(); calculerVoisins(); } // --- Les Getters et Setters --- public int getLignes() { return this.lignes; } public int getColonnes() { return this.colonnes; } public Case getCase(int l, int c) { return this.plateau[l][c]; } // <--- LES DEUX MÉTHODES QUI TE MANQUAIENT ICI ---> public boolean isPartieTerminee() { return this.partieTerminee; } public void setPartieTerminee(boolean terminee) { this.partieTerminee = terminee; } // --- Les algorithmes du jeu --- private void placerMines() { Random rand = new Random(); int minesPlacees = 0; while (minesPlacees < this.mines) { int l = rand.nextInt(this.lignes); int c = rand.nextInt(this.colonnes); if (!this.plateau[l][c].isMinee()) { this.plateau[l][c].setMinee(true); minesPlacees++; } } } private void calculerVoisins() { for (int i = 0; i < this.lignes; i++) { for (int j = 0; j < this.colonnes; j++) { if (!this.plateau[i][j].isMinee()) { int compteMines = 0; for (int di = -1; di <= 1; di++) { for (int dj = -1; dj <= 1; dj++) { int voisinI = i + di; int voisinJ = j + dj; if (voisinI >= 0 && voisinI < this.lignes && voisinJ >= 0 && voisinJ < this.colonnes) { if (this.plateau[voisinI][voisinJ].isMinee()) { compteMines++; } } } } this.plateau[i][j].setNbMinesVoisines(compteMines); } } } } public boolean revelerCase(int l, int c) { Case caseCliquee = this.plateau[l][c]; if (caseCliquee.isRevelee() || caseCliquee.getMarqueur() == 1) { return false; } caseCliquee.setRevelee(true); if (caseCliquee.isMinee()) { return true; } if (caseCliquee.getNbMinesVoisines() == 0) { for (int di = -1; di <= 1; di++) { for (int dj = -1; dj <= 1; dj++) { int voisinL = l + di; int voisinC = c + dj; if (voisinL >= 0 && voisinL < this.lignes && voisinC >= 0 && voisinC < this.colonnes) { revelerCase(voisinL, voisinC); } } } } return false; } public boolean estGagnee() { int casesRevelees = 0; for (int i = 0; i < this.lignes; i++) { for (int j = 0; j < this.colonnes; j++) { if (this.plateau[i][j].isRevelee()) { casesRevelees++; } } } int casesVidesTotales = (this.lignes * this.colonnes) - this.mines; return casesRevelees == casesVidesTotales; } }