103 lines
3.2 KiB
Java
103 lines
3.2 KiB
Java
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]; }
|
|
}
|