171 lines
4.6 KiB
Java
171 lines
4.6 KiB
Java
|
import javax.swing.*;
|
||
|
import java.awt.*;
|
||
|
import javax.swing.event.*;
|
||
|
import java.awt.event.*;
|
||
|
import java.util.*;
|
||
|
|
||
|
/** Programmation d'un jeu de Morpion avec une interface graphique Swing.
|
||
|
*
|
||
|
* REMARQUE : Dans cette solution, le patron MVC n'a pas été appliqué !
|
||
|
* On a un modèle (?), une vue et un contrôleur qui sont fortement liés.
|
||
|
*
|
||
|
* @author Xavier Crégut
|
||
|
* @version $Revision: 1.4 $
|
||
|
*/
|
||
|
|
||
|
public class MorpionSwing {
|
||
|
|
||
|
// les images à utiliser en fonction de l'état du jeu.
|
||
|
private static final Map<ModeleMorpion.Etat, ImageIcon> images
|
||
|
= new HashMap<ModeleMorpion.Etat, ImageIcon>();
|
||
|
static {
|
||
|
images.put(ModeleMorpion.Etat.VIDE, new ImageIcon("blanc.jpg"));
|
||
|
images.put(ModeleMorpion.Etat.CROIX, new ImageIcon("croix.jpg"));
|
||
|
images.put(ModeleMorpion.Etat.ROND, new ImageIcon("rond.jpg"));
|
||
|
}
|
||
|
|
||
|
// Choix de réalisation :
|
||
|
// ----------------------
|
||
|
//
|
||
|
// Les attributs correspondant à la structure fixe de l'IHM sont définis
|
||
|
// « final static » pour montrer que leur valeur ne pourra pas changer au
|
||
|
// cours de l'exécution. Ils sont donc initialisés sans attendre
|
||
|
// l'exécution du constructeur !
|
||
|
|
||
|
private ModeleMorpion modele; // le modèle du jeu de Morpion
|
||
|
|
||
|
// Les éléments de la vue (IHM)
|
||
|
// ----------------------------
|
||
|
|
||
|
/** Fenêtre principale */
|
||
|
private JFrame fenetre;
|
||
|
|
||
|
/** Bouton pour quitter */
|
||
|
private final JButton boutonQuitter = new JButton("Q");
|
||
|
|
||
|
/** Bouton pour commencer une nouvelle partie */
|
||
|
private final JButton boutonNouvellePartie = new JButton("N");
|
||
|
|
||
|
/** Cases du jeu */
|
||
|
private final JLabel[][] cases = new JLabel[3][3];
|
||
|
|
||
|
/** Zone qui indique le joueur qui doit jouer */
|
||
|
private final JLabel joueur = new JLabel();
|
||
|
|
||
|
|
||
|
// Le constructeur
|
||
|
// ---------------
|
||
|
|
||
|
/** Construire le jeu de morpion */
|
||
|
public MorpionSwing() {
|
||
|
this(new ModeleMorpionSimple());
|
||
|
}
|
||
|
|
||
|
/** Construire le jeu de morpion */
|
||
|
public MorpionSwing(ModeleMorpion modele) {
|
||
|
// Initialiser le modèle
|
||
|
this.modele = modele;
|
||
|
|
||
|
// Créer les cases du Morpion
|
||
|
for (int i = 0; i < this.cases.length; i++) {
|
||
|
for (int j = 0; j < this.cases[i].length; j++) {
|
||
|
this.cases[i][j] = new JLabel();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Initialiser le jeu
|
||
|
this.recommencer();
|
||
|
|
||
|
// Construire la vue (présentation)
|
||
|
// Définir la fenêtre principale
|
||
|
this.fenetre = new JFrame("Morpion");
|
||
|
this.fenetre.setLocation(100, 200);
|
||
|
|
||
|
// Construire le contrôleur (gestion des événements)
|
||
|
this.fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||
|
|
||
|
// Création du contenu
|
||
|
Container contenu = fenetre.getContentPane();
|
||
|
contenu.setLayout(new BorderLayout());
|
||
|
|
||
|
// Ajout de la bar
|
||
|
JMenuBar bar = new JMenuBar();
|
||
|
this.fenetre.setJMenuBar(bar);
|
||
|
|
||
|
// Ajout d'un menu dans la bar
|
||
|
JMenu menu = new JMenu("Jeu");
|
||
|
bar.add(menu);
|
||
|
|
||
|
// Ajout d'items dans le menu
|
||
|
JMenuItem newGame = new JMenuItem("Nouvelle Partie");
|
||
|
menu.add(newGame);
|
||
|
JMenuItem quitter = new JMenuItem("Quitter");
|
||
|
menu.add(quitter);
|
||
|
|
||
|
// Définir le Panel de la grille
|
||
|
JPanel boutons_grid = new JPanel(new GridLayout(3, 3));
|
||
|
contenu.add(boutons_grid, BorderLayout.NORTH);
|
||
|
|
||
|
// Ajout de la grille
|
||
|
for (int i = 0; i < 9; i++) {
|
||
|
JButton b = new JButton("", new ImageIcon("blanc.jpg"));
|
||
|
b.setBorder(BorderFactory.createEmptyBorder());
|
||
|
b.setContentAreaFilled(false);
|
||
|
boutons_grid.add(b);
|
||
|
}
|
||
|
|
||
|
// Définir le Panel des actions
|
||
|
JPanel boutons_actions = new JPanel(new GridLayout(1, 3));
|
||
|
contenu.add(boutons_actions, BorderLayout.SOUTH);
|
||
|
|
||
|
// Ajout des Buttons Next, Current et Quit
|
||
|
JButton next = new JButton("N");
|
||
|
boutons_actions.add(next);
|
||
|
|
||
|
JButton current = new JButton("", new ImageIcon("rond.jpg"));
|
||
|
current.setBorder(BorderFactory.createEmptyBorder());
|
||
|
current.setContentAreaFilled(false);
|
||
|
boutons_actions.add(current);
|
||
|
|
||
|
JButton quit = new JButton("Q");
|
||
|
boutons_actions.add(quit);
|
||
|
|
||
|
// afficher la fenêtre
|
||
|
this.fenetre.pack(); // redimmensionner la fenêtre
|
||
|
this.fenetre.setVisible(true); // l'afficher
|
||
|
|
||
|
}
|
||
|
|
||
|
// Quelques réactions aux interactions de l'utilisateur
|
||
|
// ----------------------------------------------------
|
||
|
|
||
|
/** Recommencer une nouvelle partie. */
|
||
|
public void recommencer() {
|
||
|
this.modele.recommencer();
|
||
|
|
||
|
// Vider les cases
|
||
|
for (int i = 0; i < this.cases.length; i++) {
|
||
|
for (int j = 0; j < this.cases[i].length; j++) {
|
||
|
this.cases[i][j].setIcon(images.get(this.modele.getValeur(i, j)));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Mettre à jour le joueur
|
||
|
joueur.setIcon(images.get(modele.getJoueur()));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// La méthode principale
|
||
|
// ---------------------
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
EventQueue.invokeLater(new Runnable() {
|
||
|
public void run() {
|
||
|
new MorpionSwing();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
}
|