SAE21_2021/Grille.java

164 lines
4.3 KiB
Java
Raw Normal View History

2022-04-27 16:16:34 +02:00
import javax.swing.*;
import java.awt.*;
2022-04-28 16:50:06 +02:00
import java.util.Random;
2022-04-27 16:16:34 +02:00
2022-04-30 16:38:56 +02:00
public class Grille extends JPanel {
2022-05-05 22:29:04 +02:00
private EtatPartie banniere;
2022-04-27 16:16:34 +02:00
private Dimension grilleSize=new Dimension(0,0);
private Case[] plateau;
2022-05-05 22:29:04 +02:00
private int taille;
private int mines;
2022-05-05 23:13:52 +02:00
private int minesLeft;
2022-04-27 16:16:34 +02:00
2022-05-04 23:03:02 +02:00
// Définition du constructeur qui correspond à une grille de jeu
2022-05-05 22:29:04 +02:00
public Grille(EtatPartie banniere,int lignes, int colonnes, int mines){
2022-04-27 16:16:34 +02:00
// Découpage de l'espace en fonction des paramètres pour la mise en place de la grille
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2022-04-28 16:50:06 +02:00
this.grilleSize = new Dimension(((screenSize.height*3/4)/lignes)*colonnes, screenSize.height*3/4 );
2022-04-27 17:42:05 +02:00
Dimension caseSize = new Dimension(this.grilleSize.height/lignes,this.grilleSize.height/lignes);
2022-04-27 16:16:34 +02:00
GridLayout damier = new GridLayout(lignes,colonnes);
this.setLayout(damier);
this.setSize(grilleSize);
2022-05-05 22:29:04 +02:00
this.taille=lignes*colonnes;
this.mines=mines;
this.banniere=banniere;
2022-05-04 23:03:02 +02:00
// On génère le plateau contenant les cases
2022-05-05 22:29:04 +02:00
GenererPlateau(taille, caseSize);
2022-04-27 16:16:34 +02:00
2022-04-28 16:50:06 +02:00
// Instalation des mines
// Création d'un tableau de nombres aléatoires pour savoir où les placer
int[] caseMine = new int[mines];
2022-04-29 10:51:55 +02:00
Random rand = new Random();
// On initialise les emplacements des mines
2022-05-05 22:29:04 +02:00
caseMine[0] = rand.nextInt(taille);
for (int i=1;i<mines;i++){
2022-05-05 22:29:04 +02:00
caseMine[i] = rand.nextInt(taille);
2022-04-29 10:51:55 +02:00
// On vérifie que la case n'a pas déjà été minée, auquel cas on change de case
for (int j=0;j<=(i-1);j++){
2022-04-29 10:51:55 +02:00
if (caseMine[i]==caseMine[j]){
2022-05-05 22:29:04 +02:00
caseMine[i] = rand.nextInt(taille);
j=-1;
2022-04-27 16:16:34 +02:00
}
2022-04-28 16:50:06 +02:00
}
}
2022-05-04 23:03:02 +02:00
// On place maintenant les mines sur la plateau en fixant la variable minee des cases à true
2022-05-05 22:29:04 +02:00
for (int i=0; i<taille;i++){
2022-04-28 16:50:06 +02:00
for (int j=0;j<mines;j++){
if (caseMine[j]==i){
2022-05-04 23:03:02 +02:00
plateau[i].setMine();
2022-04-28 16:50:06 +02:00
}
}
}
2022-05-04 23:03:02 +02:00
// On cherche à connaître le nombre de mines autour de chaque case
2022-05-05 22:29:04 +02:00
for (int i=0;i<taille;i++){
2022-05-04 23:03:02 +02:00
int entourage = 0;
// On vérifie pour chaque case qu'elle n'est pas déjà à l'extrémité du plateau où on cherche une case
// Mine au dessus à droite
if ((i>colonnes)&&(i%colonnes!=colonnes-1)){
for (int j=0;j<mines;j++){
2022-05-04 23:03:02 +02:00
if (caseMine[j]==i-colonnes+1){
entourage+=1;
}
2022-04-28 17:57:18 +02:00
}
}
2022-05-04 23:03:02 +02:00
// Mine au dessus à gauche
if ((i>colonnes)&&(i%colonnes!=0)){
for (int j=0;j<mines;j++){
if (caseMine[j]==i-colonnes-1){
2022-05-04 23:03:02 +02:00
entourage+=1;
}
2022-04-28 17:57:18 +02:00
}
}
2022-05-04 23:03:02 +02:00
// Mine en dessous à droite
2022-05-05 22:29:04 +02:00
if ((i<=taille-colonnes)&&(i%colonnes!=colonnes-1)){
for (int j=0;j<mines;j++){
2022-05-04 23:03:02 +02:00
if (caseMine[j]==i+colonnes+1){
entourage+=1;
}
2022-04-28 17:57:18 +02:00
}
}
2022-05-04 23:03:02 +02:00
// Mine en bas à gauche
2022-05-05 22:29:04 +02:00
if ((i!=taille-colonnes)&&(i%colonnes!=0)){
for (int j=0;j<mines;j++){
if (caseMine[j]==i+colonnes-1){
2022-05-04 23:03:02 +02:00
entourage+=1;
}
2022-04-28 17:57:18 +02:00
}
}
2022-05-04 23:03:02 +02:00
// Mine au dessus
if (i>colonnes){
for (int j=0;j<mines;j++){
if (caseMine[j]==i-colonnes){
2022-05-04 23:03:02 +02:00
entourage+=1;
}
2022-04-28 17:57:18 +02:00
}
}
2022-05-04 23:03:02 +02:00
// Mine en dessous
2022-05-05 22:29:04 +02:00
if (i<=taille-colonnes){
for (int j=0;j<mines;j++){
if (caseMine[j]==i+colonnes){
2022-05-04 23:03:02 +02:00
entourage+=1;
}
2022-04-28 17:57:18 +02:00
}
}
2022-05-04 23:03:02 +02:00
// Mine à droite
if (i%colonnes!=colonnes-1){
for (int j=0;j<mines;j++){
if (caseMine[j]==i+1){
2022-05-04 23:03:02 +02:00
entourage+=1;
}
}
2022-05-04 23:03:02 +02:00
}
// Mine à gauche
if (i%colonnes!=0){
for (int j=0;j<mines;j++){
if (caseMine[j]==i-1){
2022-05-04 23:03:02 +02:00
entourage+=1;
}
2022-04-28 17:57:18 +02:00
}
}
2022-05-04 23:03:02 +02:00
plateau[i].setEntourage(entourage);
2022-04-28 17:57:18 +02:00
}
2022-04-30 16:38:56 +02:00
// On place les cases à leur état actuel dans la grille
2022-05-05 22:29:04 +02:00
AfficherPlateau(taille);
2022-04-29 10:03:05 +02:00
}
2022-05-04 23:03:02 +02:00
// Méthode pour Génerer le plateau
protected void GenererPlateau(int taille, Dimension caseSize){
this.plateau= new Case[taille];
for (int i=0;i<taille;i++){
2022-05-05 22:29:04 +02:00
this.plateau[i]= new Case(this,caseSize);
2022-05-04 23:03:02 +02:00
}
}
// Méthode pour Afficher le plateau
2022-05-04 23:03:02 +02:00
protected void AfficherPlateau(int taille){
2022-04-29 10:03:05 +02:00
for (int i=0;i<taille;i++){
2022-05-04 19:53:32 +02:00
this.add(this.plateau[i]);
2022-04-27 16:16:34 +02:00
}
2022-04-29 10:03:05 +02:00
}
2022-04-27 16:16:34 +02:00
2022-04-28 16:50:06 +02:00
// Méthode pour obtenir la taille de la grille de jeu
2022-05-04 23:03:02 +02:00
public Dimension getGrilleSize(){
2022-04-27 16:16:34 +02:00
return grilleSize;
}
2022-05-05 22:29:04 +02:00
// Méthode pour déterminer le nombre de mines restantes
public void MinesLeft(){
2022-05-05 23:13:52 +02:00
this.minesLeft=this.mines;
2022-05-05 22:29:04 +02:00
for (int i=0;i<taille;i++){
//System.out.println("case repéree ? == "+plateau[i].getReperee());
if(plateau[i].getReperee()==true){
2022-05-05 23:13:52 +02:00
this.minesLeft-=1;
2022-05-05 22:29:04 +02:00
}
}
2022-05-05 23:13:52 +02:00
this.banniere.setMinesLeft(this.minesLeft);
2022-05-05 22:29:04 +02:00
}
2022-04-27 16:16:34 +02:00
}