TP-programmation-orientee-o.../TP12/MorpionSwing.java

171 lines
4.6 KiB
Java
Raw Permalink Normal View History

2023-06-20 19:02:09 +00:00
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();
}
});
}
}