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 :
*
* - embarqué dans une page web (JApplet)
* - comme une application autonome
*
*
* 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);
}
}
}