import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.lang.reflect.InvocationTargetException; import javax.swing.JApplet; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.RootPaneContainer; import javax.swing.SwingUtilities; /** * Implementation Java du jeu FloodIt de LabPixies * * Le jeu est distribuable sous deux formes : * * * La modélisation objet a été un peu mise de côé ;-< * * @author loic * */ public class JFloodIt extends JApplet implements MouseListener { // taille de la grille public static final int TAILLE = 12; int [][] zone; Etat etat; RootPaneContainer rpc; int restart; public void init() { initialisation(); rpc = this; try { SwingUtilities.invokeAndWait(new Runnable(){ public void run() { createGUI(true); } }); } catch (InterruptedException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } restart = 0; } public void start() { System.out.println("-- Start "+ (restart++)); for (int i= 0; i < TAILLE; ++i ) { for (int j=0; j < TAILLE; ++j) { zone[i][j] = (int)(Math.random() * 6.0); System.out.print(zone[i][j]); } System.out.println(""); etat.start(); } repaint(); } public void initialisation() { System.out.println("-- Initialisation"); zone = new int[TAILLE][TAILLE]; } /** * Cette méthode est intéressante car elle crée l'interface graphique * "indépendamment" du conteneur de plus haut niveau : JApplet ou JFrame * @param isApplet */ public void createGUI(boolean isApplet) { JFrame frame = null; if (!isApplet) { frame = new JFrame("JFloodIt"); frame.setPreferredSize(new Dimension(300, 300)); rpc = frame; } Zone grille = new Zone(zone); rpc.getContentPane().add(grille); grille.addMouseListener(this); etat = new Etat(); rpc.getContentPane().add(etat, BorderLayout.SOUTH); if (!isApplet) { frame.pack(); frame.setVisible(true); } } @Override public void mouseClicked(MouseEvent e) { int i = e.getX() / Zone.TAILLE; int j = e.getY() / Zone.TAILLE; // on vérifie que l'on n'est pas hors coordonnées // même si remplir le fait aussi if ((i>= 0) && (i =0) && (j< TAILLE)) { if (remplir (zone, 0, 0, zone[0][0], zone[i][j])) etat.incrementer(); rpc.getContentPane().repaint(); } } @Override public void mouseEntered(MouseEvent arg0) {} @Override public void mouseExited(MouseEvent arg0) {} @Override public void mousePressed(MouseEvent arg0) {} @Override public void mouseReleased(MouseEvent arg0) {} /** * Fonction récursive pour propager une couleur suivant le principe * du rza de marée * * @param grille la grille de propagation, un carré * @param i la ligne * @param j la colonne * @param ancien l'ancienne couleur mise à jour * @param nouv la nouvelle couleur * @return vrai si remplir a fait au moins un changement, faux sinon */ static boolean remplir(int[][] grille, int i, int j, int ancien, int nouv) { // bon, les returns multiples c'est pas beau, mais ca marche quand meme. if ((i>=TAILLE) || (j>=TAILLE) || (i<0) || (j<0)) return false; if ((i==0) && (j==0) && nouv == ancien) return false; if (grille[i][j] == ancien) { grille[i][j] = nouv; remplir(grille, i , j+1, ancien, nouv); remplir(grille, i+1, j, ancien, nouv); remplir(grille, i-1, j, ancien, nouv); remplir(grille, i, j-1, ancien, nouv); } return true; } public static void main(String[] args) { final JFloodIt jeu = new JFloodIt(); jeu.initialisation(); SwingUtilities.invokeLater(new Runnable() { public void run() { jeu.createGUI(false); jeu.start(); } }); } } /** * Petite barre d'état pour le jeu. * Affiche le nombre de coups de la partie * * @author loic * */ class Etat extends JLabel { int compteur = 0; public Etat() { super(""); setOpaque(true); start(); } public void start() { setText("Cliquer sur une case pour commencer"); } public int incrementer() { ++compteur; setText("Coup : "+compteur); return compteur; } } /** * Classe qui permet d'affficher la zone de jeu avec des zolies couleurs * * @author loic * */ class Zone extends JPanel { int [][] zone; public static final int TAILLE = 20; public static final Color[] COULEURS = {Color.blue, Color.red, Color.yellow, Color.green, Color.magenta, Color.gray }; public Zone (int[][] z) { super(); zone = z; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); for (int i =0; i< zone.length; ++i) for(int j=0; j < zone.length; ++j) { g.setColor(COULEURS[zone[i][j]]); g.fillRect(i*TAILLE, j*TAILLE, TAILLE, TAILLE); } } }