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 :
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 de AfficherPlateau :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 plateau :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 case :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 placerCase :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 verifierVictoire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } }
Partager