1 pièce(s) jointe(s)
Amélioration conceptuelle d'un morpion
Bonjour,
J'ai décidé de faire un morpion en java pour m'exercer. ( je commence par un truc simple pour ensuite faire des plus gros projets )
Je voudrais créer un code propre conceptuellement.
Je suis parvenu à faire fonctionner mon morpion et je voudrais votre avis.
Voila ce que j'ai fais ( ou que j'ai voulu faire car je ne sais pas si ma conception est correcte) :
- 1 classe = 1 service
- Séparation du modèle et de la vue (pattern MVC)
- Utilisation du pattern observer
- Je ne comprends pas à quoi sert le paramètre du notifyObservers dans l'objet observable donc j'ai mis un truc au pif (le plateau).
- Je voudrais savoir si vous auriez fait comme cela pour faire un morpion ?
Merci d'avance
Diagramme de classes :
Pièce jointe 181751
La classe LancerJeu contient le main()
La classe AfficherPlateau est la vue, c'est un JFrame qui a un gridLayout(3,3)
La classe Plateau contient les données, accès aux cases et aux joueurs
La classe Case est un héritage de JButton à laquelle j'ai ajouté des coordonnées
La classe PlacerCase sert à placer soit une croix soit un rond selon le joueur actuel
La classe VerifierVictoire vérifie si un joueur a gagné et arrête le jeu si c'est le cas
Code de LancerJeu :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class LancerJeu {
AfficherPlateau afficherPlateau;
Plateau plateau;
public LancerJeu(){
plateau = new Plateau();
afficherPlateau = new AfficherPlateau(plateau);
}
public static void main (String args []){
LancerJeu lancerJeu = new LancerJeu();
}
} |
Code de AfficherPlateau :
Code:
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
|
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.util.Observer;
import java.util.Observable;
public class AfficherPlateau extends JFrame implements Observer{
Plateau plateau;
public AfficherPlateau(Plateau plateau){
this.plateau = plateau;
afficher();
init(plateau.placerCase);
}
public void afficher(){
this.setTitle("Morpion");
this.setSize(500, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setLayout(new GridLayout(3, 3));
for(int i=0; i < plateau.listeCases.size(); i++){
this.getContentPane().add(plateau.listeCases.get(i));
}
this.setVisible(true);
}
public void init(PlacerCase signal) {
signal.addObserver(this);
}
public void update(Observable observable, Object test) {
revalidate();
repaint();
}
} |
Code de plateau :
Code:
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
|
import java.util.ArrayList;
public class Plateau {
public ArrayList<Case> listeCases;
public String joueur1;
public String joueur2;
public String joueurCourant;
public PlacerCase placerCase;
public VerifierVictoire verifierVictoire;
public Plateau(){
listeCases = new ArrayList<Case>();
joueur1 = "toto";
joueur2 = "titi";
joueurCourant = joueur1;
placerCase = new PlacerCase(this);
creerCases();
VerifierVictoire verifierVictoire = new VerifierVictoire(this);
}
void creerCases(){
for (int x = 0; x < 3; x ++){
for(int y = 0; y < 3; y++){
Case case1 = new Case(x,y);
case1.addActionListener(placerCase);
listeCases.add(case1);
}
}
}
} |
Code de case :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
import javax.swing.JButton;
public class Case extends JButton {
public int x;
public int y;
public Case(int x, int y){
super("");
this.x = x;
this.y = y;
}
public void setText(String texte){
super.setText(texte);
}
} |
Code de placerCase :
Code:
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
|
import java.awt.event.*;
import java.util.Observable;
public class PlacerCase extends Observable implements ActionListener {
Plateau plateau;
public PlacerCase(Plateau plateau){
this.plateau = plateau;
}
public void actionPerformed(ActionEvent e){
if(plateau.joueurCourant == plateau.joueur1){
((Case)e.getSource()).setText("X");
plateau.joueurCourant = plateau.joueur2;
}
else {
((Case)e.getSource()).setText("O");
plateau.joueurCourant = plateau.joueur1;
}
setChanged();
notifyObservers(this.plateau);
}
} |
Code de verifierVictoire :
Code:
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
|
import java.util.Observer;
import java.util.Observable;
public class VerifierVictoire implements Observer{
Plateau plateau;
public VerifierVictoire(Plateau plateau){
this.plateau = plateau;
init(plateau.placerCase);
verifier();
}
public void verifier(){
// arrête le jeu si les conditions de victoire sont remplis
System.out.println("verification");
}
public void init(PlacerCase signal) {
signal.addObserver(this);
}
public void update(Observable observable, Object test) {
verifier();
}
} |