Files

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]; }
}