2022-04-28 21:31:03 +02:00
|
|
|
//Tom Monin et Clément Martins
|
|
|
|
//Class pour des fonction static de jeu
|
|
|
|
//V2
|
|
|
|
|
2022-05-05 01:41:54 +02:00
|
|
|
import java.io.*;
|
2022-04-27 18:01:00 +02:00
|
|
|
import java.util.*;
|
2022-04-28 20:43:37 +02:00
|
|
|
import java.awt.event.*;
|
2022-05-05 01:41:54 +02:00
|
|
|
import java.io.ObjectOutputStream;
|
2022-04-29 14:20:40 +02:00
|
|
|
import java.awt.*;
|
|
|
|
import javax.swing.*;
|
2022-04-27 18:01:00 +02:00
|
|
|
|
|
|
|
public class plateau{
|
2022-04-29 14:20:40 +02:00
|
|
|
private paintMenuJeu logo;
|
|
|
|
private JFrame fenetre;
|
|
|
|
private observateurSAV observateur;
|
|
|
|
private int ligne, collonne, bombe;
|
|
|
|
private paintMenuJeu[] tabScore= new paintMenuJeu[3];
|
|
|
|
private Case[][] tableau;
|
2022-04-29 17:20:43 +02:00
|
|
|
public plateau(JFrame fenetre0){
|
2022-04-29 14:20:40 +02:00
|
|
|
this.fenetre=fenetre0;
|
|
|
|
}
|
|
|
|
public void setLogo(paintMenuJeu logo0){
|
|
|
|
this.logo=logo0;
|
|
|
|
}
|
|
|
|
public void setObservateur(observateurSAV observateur0){
|
|
|
|
this.observateur=observateur0;
|
|
|
|
}
|
|
|
|
public int getLigne(){
|
|
|
|
return this.ligne;
|
|
|
|
}
|
|
|
|
public int getCollonne(){
|
|
|
|
return this.collonne;
|
|
|
|
}
|
|
|
|
public int getBombe(){
|
|
|
|
return this.bombe;
|
|
|
|
}
|
|
|
|
public JFrame getFenetre(){
|
|
|
|
return this.fenetre;
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
//-------------------------Fonction plaçant les bombes aléatoirement------------------------
|
|
|
|
|
2022-04-29 14:20:40 +02:00
|
|
|
private void setAllBombe(){
|
2022-04-27 18:01:00 +02:00
|
|
|
Random rand = new Random();
|
2022-04-28 21:31:03 +02:00
|
|
|
//on répète le nombre de fois le nombre de bombe a placer
|
2022-04-29 14:20:40 +02:00
|
|
|
for(int i=0; i<this.bombe; i++){
|
2022-04-28 21:31:03 +02:00
|
|
|
//on genere 2 chiffre aléatoire(ligne et collonne)
|
2022-04-29 14:20:40 +02:00
|
|
|
int x=rand.nextInt(this.ligne);
|
|
|
|
int y=rand.nextInt(this.collonne);
|
2022-04-28 21:31:03 +02:00
|
|
|
//si il n'y a pas de bombe ici
|
2022-04-29 14:20:40 +02:00
|
|
|
if(this.tableau[x][y].getBombe()==false){
|
2022-04-28 21:31:03 +02:00
|
|
|
//on en place une
|
2022-04-29 14:20:40 +02:00
|
|
|
this.tableau[x][y].setBombe();
|
2022-04-27 18:01:00 +02:00
|
|
|
}else{
|
2022-04-28 21:31:03 +02:00
|
|
|
//autrement nous recomencerons 1 fois de plus le tirage pour ne pas modifier le nombre de bombe
|
2022-04-27 18:01:00 +02:00
|
|
|
i--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
//-------------------------Fonction mettant le nombre de bombe voisin a chaque Case------------------
|
|
|
|
|
2022-04-29 14:20:40 +02:00
|
|
|
public void setAllVoisin(){
|
2022-04-28 21:31:03 +02:00
|
|
|
//nous parcourons le tableau du jeu
|
2022-04-29 14:20:40 +02:00
|
|
|
for(int i=0; i<this.tableau.length; i++){
|
|
|
|
for(int t=0; t<this.tableau[i].length; t++){
|
2022-04-27 18:01:00 +02:00
|
|
|
int voisin=0;
|
2022-04-28 21:31:03 +02:00
|
|
|
//nous regardons dans les cases adjacentes(si elles existe) si elle sont des bombes
|
2022-04-27 18:01:00 +02:00
|
|
|
if(i>0){
|
2022-04-29 14:20:40 +02:00
|
|
|
if(this.tableau[i-1][t].getBombe()==true){
|
2022-04-28 21:31:03 +02:00
|
|
|
//si elle le sont alors nous augmentons le nombre de voisin
|
2022-04-27 18:01:00 +02:00
|
|
|
voisin++;
|
|
|
|
}
|
|
|
|
if(t>0){
|
2022-04-29 14:20:40 +02:00
|
|
|
if(this.tableau[i-1][t-1].getBombe()==true){
|
2022-04-27 18:01:00 +02:00
|
|
|
voisin++;
|
|
|
|
}
|
|
|
|
}
|
2022-04-29 14:20:40 +02:00
|
|
|
if(t<this.tableau[i].length-1){
|
|
|
|
if(this.tableau[i-1][t+1].getBombe()==true){
|
2022-04-27 18:01:00 +02:00
|
|
|
voisin++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-04-29 14:20:40 +02:00
|
|
|
if(i<this.tableau.length-1){
|
|
|
|
if(this.tableau[i+1][t].getBombe()==true){
|
2022-04-27 18:01:00 +02:00
|
|
|
voisin++;
|
|
|
|
}
|
|
|
|
if(t>0){
|
2022-04-29 14:20:40 +02:00
|
|
|
if(this.tableau[i+1][t-1].getBombe()==true){
|
2022-04-27 18:01:00 +02:00
|
|
|
voisin++;
|
|
|
|
}
|
|
|
|
}
|
2022-04-29 14:20:40 +02:00
|
|
|
if(t<this.tableau[i].length-1){
|
|
|
|
if(this.tableau[i+1][t+1].getBombe()==true){
|
2022-04-27 18:01:00 +02:00
|
|
|
voisin++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(t>0){
|
2022-04-29 14:20:40 +02:00
|
|
|
if(this.tableau[i][t-1].getBombe()==true){
|
2022-04-27 18:01:00 +02:00
|
|
|
voisin++;
|
|
|
|
}
|
|
|
|
}
|
2022-04-29 14:20:40 +02:00
|
|
|
if(t<this.tableau[i].length-1){
|
|
|
|
if(this.tableau[i][t+1].getBombe()==true){
|
2022-04-27 18:01:00 +02:00
|
|
|
voisin++;
|
|
|
|
}
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
//finalement nous mettons pour cette case sont nombre de voisin
|
2022-04-29 14:20:40 +02:00
|
|
|
this.tableau[i][t].setVoisin(voisin);
|
2022-04-28 20:43:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
|
|
|
|
//-------------------------------Fonction qui verifie l'etat de jeu(perdu, gagner)------------------------
|
|
|
|
|
2022-04-29 14:20:40 +02:00
|
|
|
public int etatDeVictoire(){
|
2022-04-28 21:31:03 +02:00
|
|
|
//variable pour une condition
|
2022-04-28 20:43:37 +02:00
|
|
|
int condition=0;
|
2022-04-28 21:31:03 +02:00
|
|
|
//nous parcourons le tableau du jeu
|
2022-04-29 14:20:40 +02:00
|
|
|
for(int i=0; i<this.tableau.length; i++){
|
|
|
|
for(int t=0; t<this.tableau[i].length; t++){
|
2022-04-28 21:31:03 +02:00
|
|
|
//si une case n'est pas visible mais que ce n'est pas une bombe
|
2022-04-29 14:20:40 +02:00
|
|
|
if(this.tableau[i][t].getVisibiliter()==false && this.tableau[i][t].getBombe()==false){
|
2022-04-28 21:31:03 +02:00
|
|
|
//nous augmentons la conditions pour montrer que la partie est toujour en cours
|
2022-04-28 20:43:37 +02:00
|
|
|
condition++;
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
//si une bombe est visible
|
2022-04-29 14:20:40 +02:00
|
|
|
if(this.tableau[i][t].getVisibiliter()==true && this.tableau[i][t].getBombe()==true){
|
2022-04-28 21:31:03 +02:00
|
|
|
//on retourne une valeur représentant la défaite: -1
|
2022-04-28 20:43:37 +02:00
|
|
|
return -1;
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
//si une bombe n'est pas susposer comme tel
|
2022-04-29 14:20:40 +02:00
|
|
|
if(this.tableau[i][t].getSuspition2()==false && this.tableau[i][t].getBombe()==true){
|
2022-04-28 21:31:03 +02:00
|
|
|
//nous augmentons la conditions pour montrer que la partie n'est pas fini
|
2022-04-28 20:43:37 +02:00
|
|
|
condition++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
//si la partie n'est pas fini
|
2022-04-28 20:43:37 +02:00
|
|
|
if(condition>0){
|
2022-04-28 21:31:03 +02:00
|
|
|
//on retourne 0 ici comme une valleur null
|
2022-04-28 20:43:37 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
//sinon le joueur a donc gagner on renvoie 1
|
2022-04-28 20:43:37 +02:00
|
|
|
return 1;
|
|
|
|
}
|
2022-04-28 21:31:03 +02:00
|
|
|
//-----------------------------------Fonction après victoire/defaite pour enlever les observateur a chaque Case--------------------------------
|
|
|
|
|
2022-04-29 12:04:55 +02:00
|
|
|
public static void removeListener(Case[][] tableau0){
|
2022-04-28 21:31:03 +02:00
|
|
|
//on parcour le tableau du jeu
|
2022-04-28 20:43:37 +02:00
|
|
|
for(int i=0; i<tableau0.length; i++){
|
|
|
|
for(int t=0; t<tableau0[i].length; t++){
|
2022-04-28 21:31:03 +02:00
|
|
|
//on récupere le tableau d'observateur
|
2022-04-28 20:43:37 +02:00
|
|
|
MouseListener[] tabListener;
|
|
|
|
tabListener=tableau0[i][t].getMouseListeners();
|
2022-04-28 21:31:03 +02:00
|
|
|
//que nous parcourons
|
2022-04-28 20:43:37 +02:00
|
|
|
for(int longeur=0; longeur<=tabListener.length-1; longeur++){
|
2022-04-28 21:31:03 +02:00
|
|
|
//on enleve a chaque case les observateur 1 par 1
|
2022-04-28 20:43:37 +02:00
|
|
|
tableau0[i][t].removeMouseListener(tabListener[longeur]);
|
|
|
|
}
|
2022-04-27 18:01:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-04-29 14:20:40 +02:00
|
|
|
public void perdu(){
|
|
|
|
for(int i=0; i<tabScore.length; i++){
|
|
|
|
this.tabScore[i].setChoix(5);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public void gagner(){
|
|
|
|
for(int i=0; i<tabScore.length; i++){
|
|
|
|
this.tabScore[i].setChoix(6);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public void setScore(int n){
|
|
|
|
for(int i=0; i<tabScore.length; i++){
|
|
|
|
tabScore[i].setScore(tabScore[i].getScore()+n);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public void paintLogo(){
|
|
|
|
this.logo.setChoix(7);
|
|
|
|
this.observateur.setFonction(true);
|
|
|
|
}
|
2022-04-29 17:20:43 +02:00
|
|
|
|
|
|
|
public void newGame(int ligne0, int collonne0, int bombe0){
|
|
|
|
this.ligne=ligne0;
|
|
|
|
this.collonne=collonne0;
|
|
|
|
this.bombe=bombe0;
|
|
|
|
this.tableau=new Case[ligne][collonne];
|
|
|
|
this.fenetre.dispose();
|
|
|
|
this.fenetre=new JFrame("démineur");
|
|
|
|
GridLayout grille = new GridLayout(ligne+1,collonne);
|
|
|
|
for(int i=0; i<collonne; i++){
|
|
|
|
paintMenuJeu menu= new paintMenuJeu(0, bombe);
|
|
|
|
menu.setPreferredSize(new Dimension(100,100));
|
2022-05-05 01:41:54 +02:00
|
|
|
if(i==0){
|
2022-04-29 17:20:43 +02:00
|
|
|
this.tabScore[0]=menu;
|
|
|
|
menu.setChoix(1);
|
|
|
|
}
|
2022-05-05 01:41:54 +02:00
|
|
|
if(i==1){
|
2022-04-29 17:20:43 +02:00
|
|
|
this.tabScore[1]=menu;
|
|
|
|
menu.setChoix(2);
|
|
|
|
}
|
2022-05-05 01:41:54 +02:00
|
|
|
if(i==2){
|
2022-04-29 17:20:43 +02:00
|
|
|
this.tabScore[2]=menu;
|
|
|
|
menu.setChoix(3);
|
|
|
|
}
|
|
|
|
if(i==collonne-1){
|
|
|
|
menu.setChoix(4);
|
|
|
|
this.setLogo(menu);
|
|
|
|
observateurSAV observateur=new observateurSAV(menu, this);
|
|
|
|
menu.addMouseListener(observateur);
|
|
|
|
this.setObservateur(observateur);
|
|
|
|
}
|
|
|
|
fenetre.add(menu);
|
|
|
|
}
|
|
|
|
fenetre.setLayout(grille);
|
|
|
|
// l'application ne se fermera que si on clique sur
|
|
|
|
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
|
|
fenetre.setVisible(true);
|
|
|
|
// nous creons le tableau de Case qui représente l'etat du jeu
|
|
|
|
// on ajoute a la fenetre toute les case (ligne*collonne)
|
|
|
|
for(int i=0; i<ligne; i++){
|
|
|
|
for(int t=0; t<collonne; t++){
|
|
|
|
this.tableau[i][t]= new Case();
|
|
|
|
this.tableau[i][t].setPreferredSize(new Dimension(50,50));
|
|
|
|
//nous ajoutons aussi a chaque case son observateur de case
|
|
|
|
this.tableau[i][t].addMouseListener(new observateurCase(i, t, this.tableau, this));
|
|
|
|
fenetre.add(this.tableau[i][t]);
|
|
|
|
}
|
|
|
|
}
|
2022-05-05 01:41:54 +02:00
|
|
|
fenetre.addWindowListener(new observateurFenetre(this));
|
2022-04-29 17:20:43 +02:00
|
|
|
//nous disposons les bombe dans le jeu
|
|
|
|
this.setAllBombe();
|
|
|
|
//maitenant que les bombe sont mise nous pouvons modifier le nombre de voisin des cases
|
|
|
|
this.setAllVoisin();
|
|
|
|
this.fenetre.pack();
|
|
|
|
}
|
2022-05-05 01:41:54 +02:00
|
|
|
public void save(){
|
|
|
|
try{
|
|
|
|
OutputStream sav = new FileOutputStream(new File("sauvegarde.data"));
|
|
|
|
ObjectOutputStream oos = new ObjectOutputStream(sav);
|
|
|
|
oos.writeInt(this.ligne);
|
|
|
|
oos.writeInt(this.collonne);
|
|
|
|
for(int i=0; i<this.ligne; i++){
|
|
|
|
for(int t=0; t<this.collonne; t++){
|
|
|
|
oos.writeObject(this.tableau[i][t]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
oos.writeInt(this.tabScore[0].getScoreMax());
|
|
|
|
oos.writeInt(this.tabScore[0].getScore());
|
|
|
|
oos.close();
|
|
|
|
sav.close();
|
|
|
|
}catch(FileNotFoundException e1){
|
|
|
|
}catch(IOException e2){
|
|
|
|
}
|
|
|
|
this.fenetre.dispose();
|
|
|
|
|
|
|
|
}
|
|
|
|
public void reprendrePartie(){
|
|
|
|
int score=0;
|
|
|
|
try{
|
|
|
|
FileInputStream file = new FileInputStream("./sauvegarde.data");
|
|
|
|
ObjectInputStream ois = new ObjectInputStream(file);
|
|
|
|
this.ligne=ois.readInt();
|
|
|
|
this.collonne=ois.readInt();
|
|
|
|
this.tableau=new Case[this.ligne][this.collonne];
|
|
|
|
for(int i=0; i<ligne; i++){
|
|
|
|
for(int t=0; t<collonne; t++){
|
|
|
|
this.tableau[i][t]=(Case) ois.readObject();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.bombe=ois.readInt();
|
|
|
|
score=ois.readInt();
|
|
|
|
}catch(FileNotFoundException e1){
|
|
|
|
System.out.println("FNF");
|
|
|
|
}catch(IOException e2){
|
|
|
|
System.out.println("IOE");
|
|
|
|
}catch(ClassNotFoundException e3){
|
|
|
|
System.out.println("CNF");
|
|
|
|
}
|
|
|
|
this.fenetre.dispose();
|
|
|
|
this.fenetre=new JFrame("démineur");
|
|
|
|
GridLayout grille = new GridLayout(ligne+1,collonne);
|
|
|
|
for(int i=0; i<collonne; i++){
|
|
|
|
paintMenuJeu menu= new paintMenuJeu(0, score);
|
|
|
|
menu.setPreferredSize(new Dimension(100,100));
|
|
|
|
if(i==0){
|
|
|
|
this.tabScore[0]=menu;
|
|
|
|
menu.setChoix(1);
|
|
|
|
}
|
|
|
|
if(i==1){
|
|
|
|
this.tabScore[1]=menu;
|
|
|
|
menu.setChoix(2);
|
|
|
|
}
|
|
|
|
if(i==2){
|
|
|
|
this.tabScore[2]=menu;
|
|
|
|
menu.setChoix(3);
|
|
|
|
}
|
|
|
|
if(i==collonne-1){
|
|
|
|
menu.setChoix(4);
|
|
|
|
this.setLogo(menu);
|
|
|
|
observateurSAV observateur=new observateurSAV(menu, this);
|
|
|
|
menu.addMouseListener(observateur);
|
|
|
|
this.setObservateur(observateur);
|
|
|
|
}
|
|
|
|
fenetre.add(menu);
|
|
|
|
}
|
|
|
|
fenetre.setLayout(grille);
|
|
|
|
// l'application ne se fermera que si on clique sur
|
|
|
|
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
|
|
fenetre.setVisible(true);
|
|
|
|
fenetre.addWindowListener(new observateurFenetre(this));
|
|
|
|
for(int i=0; i<ligne; i++){
|
|
|
|
for(int t=0;t<collonne; t++){
|
|
|
|
this.fenetre.add(this.tableau[i][t]);
|
|
|
|
this.tableau[i][t].repaint();
|
|
|
|
this.tableau[i][t].addMouseListener(new observateurCase(i, t, this.tableau, this));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.fenetre.pack();
|
|
|
|
}
|
|
|
|
|
2022-04-27 18:01:00 +02:00
|
|
|
}
|