1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
package pobj.game.demineur.view;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.JPanel;
import pobj.game.demineur.model.DemineurModel;
import pobj.game.demineur.model.ModelChangeEvent;
import pobj.game.demineur.model.ModelChangeListener;
/**
* La vue du Démineur
* @author caroline chopinaud
*/
public class DemineurView extends JPanel implements ModelChangeListener {
/** La hauteur d'une case */
public final static int HAUTEUR_CASE = 30;
/** La largeur d'une case */
public final static int LARGEUR_CASE = 30;
/** Le modèle du démineur */
private DemineurModel model;
/** Le tableau des vues des Cases */
private CaseView tableauCase[][];
/** La liste des écouteurs de notification de changement au niveau de la vue */
private ArrayList<ViewChangeListener> changeListeners;
/**
* Création d'une vue du Démienur
* @param model le modèlé du Démineur
*/
public DemineurView(DemineurModel model) {
this.model = model;
// TODO: ajouter la vue "this" comme écouteur du modèle pour les ModelChangeEvent
model.addModelChangeListener(this);
// TODO: construire la liste des écouteur de changement de vue
changeListeners = new ArrayList<ViewChangeListener>();
// création de la vue
makeGUI();
}
/**
* Initialisation graphique de la vue du Démineur. Tout en vrac mais on pourra séparer comme dans le cours.
*/
private void makeGUI() {
setLayout(new GridLayout(model.getnbCol(), model.getnbRow()));
setPreferredSize (new Dimension(model.getnbCol()*LARGEUR_CASE, model.getnbRow()*HAUTEUR_CASE));
tableauCase = new CaseView[model.getnbCol()][model.getnbRow()];
CaseView maCase;
for (int i = 0; i < model.getnbCol(); i++) {
for (int j = 0; j < model.getnbRow(); j++) {
maCase = new CaseView(i, j, this, model.getCase(i, j));
add(maCase);
tableauCase[i][j] = maCase;
}
}
}
/**
* Accesseur au modèle du jeu
* @return le modèle du jeu
*/
public DemineurModel getModel(){
return model;
}
/**
* Enregistre un écouteur de la vue
* @param l l'écouteur du modèle à ajouter
*/
public void addViewChangeListener(ViewChangeListener l) {
changeListeners.add(l);
}
/**
* Désenregistre un écouteur de la vue
* @param l l'écouteur du modèle à supprimer
*/
public void removeViewChangeListener(ViewChangeListener l) {
changeListeners.remove(l);
}
/**
* Notifie les écouteurs d'un changement dans la vue
* @param event l'événement à envoyer
*/
public void fireModelChange(ViewChangeEvent event) {
for(ViewChangeListener l : changeListeners){
l.viewChanged(event);
}
}
/**
* Lors d'un changement dans le modèle. Ici on affiche si la partie a été gagnée ou perdue. Il faudrait
* le faire via le smiley.
* Réafiche à la case ayant généré cet événement. Réaffiche tout le jeu si la partie est perdue.
*/
public void modelChanged(ModelChangeEvent evt){
//System.out.println("je suis dans modelChanged");
if (evt.getStatut() == evt.GAGNE) {
System.out.println("bravo, vous avez gagné!");
}
else if (evt.getStatut() == evt.PERDU) {
System.out.println("vous avez perdu!");
for (int i = 0; i < tableauCase.length; i++) {
for (int j = 0; j < tableauCase[0].length; j++) {
tableauCase[i][j].drawCase();
}
}
}
else {
tableauCase[evt.getCol()][evt.getRow()].drawCase();
}
}
}// DemineurVue |
Partager