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-05-21 18:41:24 +02:00
|
|
|
public class Grille extends JPanel{
|
2022-05-21 17:53:19 +02:00
|
|
|
private Banniere banniere;
|
2022-04-27 16:16:34 +02:00
|
|
|
private Dimension grilleSize=new Dimension(0,0);
|
2022-05-01 13:41:44 +02:00
|
|
|
private Case[] plateau;
|
2022-05-10 11:10:31 +02:00
|
|
|
private int colonnes;
|
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-05-17 23:04:53 +02:00
|
|
|
private boolean enJeu;
|
2022-05-21 22:17:25 +02:00
|
|
|
private FrameJeu fenetre;
|
2022-04-27 16:16:34 +02:00
|
|
|
|
2022-05-21 18:41:24 +02:00
|
|
|
// TODO : entourage dans une méthode
|
|
|
|
// TODO : Recréer un tableau avec les cases minees
|
|
|
|
|
2022-05-04 23:03:02 +02:00
|
|
|
// Définition du constructeur qui correspond à une grille de jeu
|
2022-05-21 22:17:25 +02:00
|
|
|
public Grille(int lignes, int colonnes, int mines, FrameJeu fenetre){
|
|
|
|
super();
|
|
|
|
this.colonnes=colonnes;
|
|
|
|
this.taille=lignes*colonnes;
|
|
|
|
this.mines=mines;
|
|
|
|
this.minesLeft=mines;
|
|
|
|
this.enJeu=true;
|
|
|
|
this.fenetre=fenetre;
|
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);
|
2022-05-21 22:17:25 +02:00
|
|
|
Banniere banniere = new Banniere(mines,this.fenetre);
|
|
|
|
this.banniere=banniere;
|
2022-05-17 11:11:29 +02:00
|
|
|
banniere.setSize(grilleSize.width,grilleSize.height/8);
|
2022-05-01 13:41:44 +02:00
|
|
|
this.setLayout(damier);
|
|
|
|
this.setSize(grilleSize);
|
2022-05-21 22:17:25 +02:00
|
|
|
|
2022-05-04 23:03:02 +02:00
|
|
|
// On génère le plateau contenant les cases
|
2022-05-16 20:19:51 +02:00
|
|
|
GenererPlateau(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);
|
2022-05-02 09:26:36 +02:00
|
|
|
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
|
2022-05-02 09:26:36 +02:00
|
|
|
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);
|
2022-05-02 09:26:36 +02:00
|
|
|
j=-1;
|
2022-04-27 16:16:34 +02:00
|
|
|
}
|
2022-04-28 16:50:06 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-01 13:41:44 +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
|
2022-05-10 11:52:26 +02:00
|
|
|
if ((i>=colonnes)&&(i%colonnes!=colonnes-1)){
|
2022-04-29 12:01:51 +02:00
|
|
|
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-29 12:01:51 +02:00
|
|
|
}
|
2022-04-28 17:57:18 +02:00
|
|
|
}
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
2022-05-04 23:03:02 +02:00
|
|
|
// Mine au dessus à gauche
|
2022-05-10 11:52:26 +02:00
|
|
|
if ((i>=colonnes)&&(i%colonnes!=0)){
|
2022-04-29 12:01:51 +02:00
|
|
|
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-29 12:01:51 +02:00
|
|
|
}
|
2022-04-28 17:57:18 +02:00
|
|
|
}
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
2022-05-04 23:03:02 +02:00
|
|
|
// Mine en dessous à droite
|
2022-05-10 11:52:26 +02:00
|
|
|
if ((i<taille-colonnes)&&(i%colonnes!=colonnes-1)){
|
2022-04-29 12:01:51 +02:00
|
|
|
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-29 12:01:51 +02:00
|
|
|
}
|
2022-04-28 17:57:18 +02:00
|
|
|
}
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
2022-05-04 23:03:02 +02:00
|
|
|
// Mine en bas à gauche
|
2022-05-10 11:52:26 +02:00
|
|
|
if ((i<taille-colonnes)&&(i%colonnes!=0)){
|
2022-04-29 12:01:51 +02:00
|
|
|
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-29 12:01:51 +02:00
|
|
|
}
|
2022-04-28 17:57:18 +02:00
|
|
|
}
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
2022-05-04 23:03:02 +02:00
|
|
|
// Mine au dessus
|
2022-05-10 11:52:26 +02:00
|
|
|
if (i>=colonnes){
|
2022-04-29 12:01:51 +02:00
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
if (caseMine[j]==i-colonnes){
|
2022-05-04 23:03:02 +02:00
|
|
|
entourage+=1;
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
2022-04-28 17:57:18 +02:00
|
|
|
}
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
2022-05-04 23:03:02 +02:00
|
|
|
// Mine en dessous
|
2022-05-10 11:52:26 +02:00
|
|
|
if (i<taille-colonnes){
|
2022-04-29 12:01:51 +02:00
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
if (caseMine[j]==i+colonnes){
|
2022-05-04 23:03:02 +02:00
|
|
|
entourage+=1;
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
2022-04-28 17:57:18 +02:00
|
|
|
}
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
2022-05-04 23:03:02 +02:00
|
|
|
// Mine à droite
|
|
|
|
if (i%colonnes!=colonnes-1){
|
2022-04-29 12:01:51 +02:00
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
if (caseMine[j]==i+1){
|
2022-05-04 23:03:02 +02:00
|
|
|
entourage+=1;
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-04 23:03:02 +02:00
|
|
|
}
|
|
|
|
// Mine à gauche
|
|
|
|
if (i%colonnes!=0){
|
2022-04-29 12:01:51 +02:00
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
if (caseMine[j]==i-1){
|
2022-05-04 23:03:02 +02:00
|
|
|
entourage+=1;
|
2022-04-29 12:01:51 +02:00
|
|
|
}
|
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-29 12:01:51 +02:00
|
|
|
|
2022-04-30 16:38:56 +02:00
|
|
|
|
2022-04-29 12:01:51 +02:00
|
|
|
// On place les cases à leur état actuel dans la grille
|
2022-05-16 20:19:51 +02:00
|
|
|
AfficherPlateau();
|
2022-05-17 11:11:29 +02:00
|
|
|
this.banniere.setMinesLeft(this.minesLeft);
|
2022-04-29 10:03:05 +02:00
|
|
|
}
|
|
|
|
|
2022-05-04 23:03:02 +02:00
|
|
|
// Méthode pour Génerer le plateau
|
2022-05-16 20:19:51 +02:00
|
|
|
protected void GenererPlateau(Dimension caseSize){
|
|
|
|
this.plateau= new Case[this.taille];
|
|
|
|
for (int i=0;i<this.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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-01 13:41:44 +02:00
|
|
|
// Méthode pour Afficher le plateau
|
2022-05-16 20:19:51 +02:00
|
|
|
protected void AfficherPlateau(){
|
|
|
|
for (int i=0;i<this.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-10 11:52:26 +02:00
|
|
|
for (int i=0;i<this.taille;i++){
|
2022-05-05 22:29:04 +02:00
|
|
|
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-05-10 11:10:31 +02:00
|
|
|
|
2022-05-10 11:52:26 +02:00
|
|
|
// Méthode déterminant les conditions de victoire
|
|
|
|
public void verifVictoire(){
|
2022-05-21 17:30:12 +02:00
|
|
|
// Compte le nombre de cases visibles
|
2022-05-16 20:19:51 +02:00
|
|
|
int casesVisibles=0;
|
2022-05-10 11:52:26 +02:00
|
|
|
for (int i=0;i<this.taille;i++){
|
2022-05-16 20:19:51 +02:00
|
|
|
if(plateau[i].getVisible()==true){
|
|
|
|
casesVisibles+=1;
|
2022-05-10 11:52:26 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-21 17:30:12 +02:00
|
|
|
// Lance la victoire si toutes les cases non minées sont révélées
|
2022-05-16 20:19:51 +02:00
|
|
|
if (taille-mines==casesVisibles){
|
|
|
|
for (int i=0;i<taille;i++){
|
|
|
|
this.plateau[i].setVictoire();
|
2022-05-23 10:47:54 +02:00
|
|
|
System.out.println("Victoire !");
|
2022-05-16 20:19:51 +02:00
|
|
|
}
|
2022-05-21 18:41:24 +02:00
|
|
|
this.banniere.setVictoire();
|
2022-05-10 11:52:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-23 10:47:54 +02:00
|
|
|
// Méthode montrer la défaite
|
|
|
|
public void Defaite(){
|
|
|
|
// Montre toutes les cases du plateau
|
|
|
|
for (int i=0;i<this.taille;i++){
|
|
|
|
this.plateau[i].setVisible();
|
|
|
|
System.out.println("Défaite !");
|
|
|
|
}
|
|
|
|
this.banniere.setDefaite();
|
|
|
|
}
|
|
|
|
|
2022-05-16 20:19:51 +02:00
|
|
|
// Methode pour récupérer le plateau de jeu
|
|
|
|
public Case[] getPlateau(){
|
|
|
|
return this.plateau;
|
|
|
|
}
|
|
|
|
|
2022-05-10 11:10:31 +02:00
|
|
|
// Méthode pour rendre visibles les cases autour d'un 0
|
|
|
|
public void setEntourageVisible(Case panel){
|
|
|
|
for(int i=0; i<this.taille;i++){
|
|
|
|
if (plateau[i]==panel){
|
|
|
|
// Mine au dessus à droite
|
2022-05-10 11:52:26 +02:00
|
|
|
if ((i>=colonnes)&&(i%colonnes!=colonnes-1)){
|
2022-05-10 11:10:31 +02:00
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
plateau[i-colonnes+1].setVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Mine au dessus à gauche
|
2022-05-10 11:52:26 +02:00
|
|
|
if ((i>=colonnes)&&(i%colonnes!=0)){
|
2022-05-10 11:10:31 +02:00
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
plateau[i-colonnes-1].setVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Mine en dessous à droite
|
|
|
|
if ((i<taille-colonnes)&&(i%colonnes!=colonnes-1)){
|
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
plateau[i+colonnes+1].setVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Mine en bas à gauche
|
|
|
|
if ((i<taille-colonnes)&&(i%colonnes!=0)){
|
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
plateau[i+colonnes-1].setVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Mine au dessus
|
2022-05-10 11:52:26 +02:00
|
|
|
if (i>=colonnes){
|
2022-05-10 11:10:31 +02:00
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
plateau[i-colonnes].setVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Mine en dessous
|
|
|
|
if (i<taille-colonnes){
|
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
plateau[i+colonnes].setVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Mine à droite
|
|
|
|
if (i%colonnes!=colonnes-1){
|
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
plateau[i+1].setVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Mine à gauche
|
|
|
|
if (i%colonnes!=0){
|
|
|
|
for (int j=0;j<mines;j++){
|
|
|
|
plateau[i-1].setVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-05-17 11:11:29 +02:00
|
|
|
|
|
|
|
// Méthode qui renvoie la banniere d'état de la partie
|
2022-05-21 17:53:19 +02:00
|
|
|
public Banniere getBanniere(){
|
2022-05-17 11:11:29 +02:00
|
|
|
return this.banniere;
|
|
|
|
}
|
2022-05-17 23:04:53 +02:00
|
|
|
// Méthode qui défini si la partie est en cours ou non
|
|
|
|
public void setEnJeu(boolean enJeu){
|
|
|
|
this.enJeu=enJeu;
|
|
|
|
}
|
|
|
|
// Méthode qui renvoie si la partie est en cours ou non
|
|
|
|
public boolean getEnJeu(){
|
|
|
|
return this.enJeu;
|
|
|
|
}
|
2022-04-27 16:16:34 +02:00
|
|
|
}
|