2022-04-28 16:50:06 +02:00
|
|
|
import javax.swing.*;
|
|
|
|
import java.awt.*;
|
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* La classe <code>Case</code> genère une case de jeu
|
|
|
|
* @version 1.1
|
|
|
|
* @author Kayyissa Haïssous
|
|
|
|
*/
|
2022-04-30 16:38:56 +02:00
|
|
|
public class Case extends JPanel {
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* grille sur laquelle est la cas
|
|
|
|
*/
|
2022-05-05 22:29:04 +02:00
|
|
|
private Grille grille;
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* nombre de mines alentours
|
|
|
|
*/
|
2022-04-29 10:03:05 +02:00
|
|
|
private int entourage;
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* statut si la case est visible ou non
|
|
|
|
*/
|
2022-04-29 10:03:05 +02:00
|
|
|
private boolean visible;
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* si la case est minée ou non
|
|
|
|
*/
|
2022-04-29 10:03:05 +02:00
|
|
|
private boolean minee;
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* si la case est marquée par l'utilisateur ou non
|
|
|
|
*/
|
2022-05-05 22:29:04 +02:00
|
|
|
private boolean reperee;
|
2022-04-28 16:50:06 +02:00
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Définition du constructeur qui genère une case
|
|
|
|
* @param grille grille de jeu
|
|
|
|
* @param caseSize taille d'une case
|
|
|
|
*/
|
2022-05-05 22:29:04 +02:00
|
|
|
public Case(Grille grille, Dimension caseSize) {
|
2022-04-28 17:57:18 +02:00
|
|
|
super();
|
2022-05-05 22:29:04 +02:00
|
|
|
// Initialisation des attributs
|
|
|
|
this.visible=false;
|
2022-05-16 20:19:51 +02:00
|
|
|
this.reperee=false;
|
2022-05-05 22:29:04 +02:00
|
|
|
this.grille=grille;
|
2022-05-01 13:41:44 +02:00
|
|
|
|
2022-05-04 23:03:02 +02:00
|
|
|
// On place un listener sur notre case pour qu'elle réagisse aux clicks du joueur
|
2022-05-17 11:11:29 +02:00
|
|
|
this.addMouseListener(new ListenerCase());
|
2022-05-01 13:41:44 +02:00
|
|
|
|
2022-05-05 22:29:04 +02:00
|
|
|
// Mise en page de la case et couleur par défaut
|
|
|
|
this.setSize(caseSize);
|
2022-04-29 10:03:05 +02:00
|
|
|
GridLayout unique = new GridLayout(1,1);
|
2022-05-01 13:41:44 +02:00
|
|
|
this.setLayout(unique);
|
2022-05-04 19:53:32 +02:00
|
|
|
this.setBackground(new Color(70, 70, 70));
|
2022-05-01 13:41:44 +02:00
|
|
|
}
|
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Méthode qui permet de montrer la case, et fait perdre si elle est minée
|
|
|
|
*/
|
2022-05-01 13:41:44 +02:00
|
|
|
public void setVisible(){
|
2022-05-17 20:53:21 +02:00
|
|
|
// On vérfie que la case n'est pas déjà visible
|
2022-05-16 20:19:51 +02:00
|
|
|
if (!this.visible){
|
2022-05-10 11:10:31 +02:00
|
|
|
this.visible = true;
|
|
|
|
|
2022-05-17 20:53:21 +02:00
|
|
|
// On affiche dans la case le nombre de mine adjacentes ( rien si aucune )
|
|
|
|
if ((!this.minee)&&(!this.reperee)){
|
2022-05-10 11:10:31 +02:00
|
|
|
this.setBackground(new Color(80, 80, 80));
|
|
|
|
if (this.entourage > 0) {
|
|
|
|
this.add(new Entourage(this.entourage, this.getSize()));
|
|
|
|
}
|
2022-05-17 20:53:21 +02:00
|
|
|
// Cherche a afficher les cases adjacente s'il n'y a aucune mine autour
|
|
|
|
else if (this.entourage == 0) {
|
|
|
|
this.grille.setEntourageVisible(this);
|
|
|
|
}
|
2022-05-17 23:04:53 +02:00
|
|
|
if (this.grille.getEnJeu()){
|
2022-05-17 20:53:21 +02:00
|
|
|
this.grille.verifVictoire();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// S'il y a une mine et que c'est la première cliquée
|
2022-05-17 23:04:53 +02:00
|
|
|
else if ((this.minee)&&(this.grille.getEnJeu())) {
|
|
|
|
this.grille.setEnJeu(false);
|
2022-05-17 20:53:21 +02:00
|
|
|
this.setBackground(new Color(200, 0, 0));
|
2022-05-21 17:30:12 +02:00
|
|
|
this.grille.Defaite();
|
2022-05-17 20:53:21 +02:00
|
|
|
}
|
|
|
|
// S'il y a une mine est que la partie est finie
|
2022-05-17 23:04:53 +02:00
|
|
|
else if ((this.minee)&&(!this.grille.getEnJeu())) {
|
2022-05-17 20:53:21 +02:00
|
|
|
this.setBackground(new Color(236, 0, 140));
|
|
|
|
|
|
|
|
// Sinon le nombre de mines autour d'elle
|
2022-05-10 11:10:31 +02:00
|
|
|
}
|
2022-05-16 20:19:51 +02:00
|
|
|
|
2022-05-10 11:10:31 +02:00
|
|
|
// Mise à jour de l'affichage de la case
|
|
|
|
this.updateUI();
|
2022-05-17 20:53:21 +02:00
|
|
|
|
2022-05-04 19:53:32 +02:00
|
|
|
}
|
2022-05-01 13:41:44 +02:00
|
|
|
}
|
2022-04-28 16:50:06 +02:00
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Méthode permettant de dire si la case est cachée ou visible
|
|
|
|
* @return this.visible
|
|
|
|
*/
|
2022-05-01 13:41:44 +02:00
|
|
|
public boolean getVisible(){
|
|
|
|
return this.visible;
|
|
|
|
}
|
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Méthode pour déclarer la présence d'une mine sur une case
|
|
|
|
*/
|
2022-05-04 23:03:02 +02:00
|
|
|
public void setMine(){
|
|
|
|
this.minee=true;
|
|
|
|
}
|
2022-04-28 17:57:18 +02:00
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Permet de dire si une case est minée
|
|
|
|
* @return this.minee
|
|
|
|
*/
|
2022-05-01 13:41:44 +02:00
|
|
|
public boolean getMine(){
|
|
|
|
return this.minee;
|
2022-04-28 17:57:18 +02:00
|
|
|
}
|
2022-05-04 23:03:02 +02:00
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
*Défini combien de mines entourent la case
|
|
|
|
* @param entourage mines autour de la case
|
|
|
|
*/
|
2022-05-04 23:03:02 +02:00
|
|
|
public void setEntourage(int entourage){
|
|
|
|
this.entourage=entourage;
|
|
|
|
}
|
2022-05-05 22:29:04 +02:00
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
*Renvoie l'entourage de la case
|
|
|
|
* @return this.entourage
|
|
|
|
*/
|
2022-05-10 11:10:31 +02:00
|
|
|
public int getEntourage(){
|
|
|
|
return this.entourage;
|
|
|
|
}
|
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Permet d'acceder à la grille sur laquelle est la case
|
|
|
|
* @return this.grille
|
|
|
|
*/
|
2022-05-10 11:10:31 +02:00
|
|
|
public Grille getGrille(){
|
|
|
|
return this.grille;
|
|
|
|
}
|
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Méthode pour savoir si le joueur pense que la case est minée
|
|
|
|
* @param reperee si la case est marquée ou non
|
|
|
|
* @param marquage quel est le marquage sur la case (0 si aucun)
|
|
|
|
*/
|
2022-05-25 13:37:32 +02:00
|
|
|
public void setReperee(boolean reperee, int marquage){
|
2022-05-05 22:29:04 +02:00
|
|
|
this.reperee=reperee;
|
2022-05-25 13:37:32 +02:00
|
|
|
if (marquage==1){
|
|
|
|
this.add(new Etoile(this.getSize()), BorderLayout.CENTER);
|
|
|
|
}
|
|
|
|
if (marquage==2){
|
|
|
|
this.add(new Doute(this.getSize()), BorderLayout.CENTER);
|
|
|
|
}
|
2022-05-05 22:29:04 +02:00
|
|
|
this.grille.MinesLeft();
|
|
|
|
}
|
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Methode pour dire si la case est marquée ou non
|
|
|
|
* @return this.reperee
|
|
|
|
*/
|
2022-05-05 22:29:04 +02:00
|
|
|
public boolean getReperee(){
|
|
|
|
return this.reperee;
|
|
|
|
}
|
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Methode pour montrer que la partie est gagnée
|
|
|
|
*/
|
2022-05-16 20:19:51 +02:00
|
|
|
public void setVictoire(){
|
2022-05-17 23:04:53 +02:00
|
|
|
this.grille.setEnJeu(false);
|
2022-05-16 20:19:51 +02:00
|
|
|
if (this.minee==true){
|
|
|
|
removeAll();
|
|
|
|
this.setBackground(new Color(236, 214, 0));;
|
2022-05-23 10:47:54 +02:00
|
|
|
this.updateUI();
|
2022-05-16 20:19:51 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* Methode pour savoir si la partie est finie ou non
|
|
|
|
* @return this.grille.getEnJeu()
|
|
|
|
*/
|
2022-05-17 20:53:21 +02:00
|
|
|
public boolean getEnJeu(){
|
2022-05-17 23:04:53 +02:00
|
|
|
return this.grille.getEnJeu();
|
2022-05-05 22:29:04 +02:00
|
|
|
}
|
2022-05-21 18:41:24 +02:00
|
|
|
|
2022-05-25 15:36:29 +02:00
|
|
|
/**
|
|
|
|
* redéfinition du toString pour sauvegarder les cases
|
|
|
|
*/
|
2022-05-24 13:49:09 +02:00
|
|
|
@Override
|
|
|
|
public String toString(){
|
|
|
|
int value=0;
|
|
|
|
if (this.minee){
|
|
|
|
value+=1;
|
|
|
|
}
|
|
|
|
if (this.reperee){
|
|
|
|
value+=2;
|
|
|
|
}
|
|
|
|
if (this.visible){
|
|
|
|
value+=4;
|
|
|
|
}
|
|
|
|
return Integer.toString(value);
|
|
|
|
}
|
2022-04-28 16:50:06 +02:00
|
|
|
}
|