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 :

Nom : diagramme.png
Affichages : 1527
Taille : 10,2 Ko

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 : 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 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
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 : 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 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
 
 
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 : 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 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
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();
  }
 
}