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 images = new HashMap(); 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(); } }); } }