Le «jeu de la vie»

publicité
Algorithmes et structures de données
Travaux pratiques
Eté 2003
G. Falque et C.-L. Mottaz Jiang
Série 4 – 0.5 pts – individuel, pour le 19 mai 2003
Le «!jeu de la vie!»
Sous le nom (un peu pompeux ?) de Jeu de la Vie ( Game of Life ou Life ) on désigne un jeu
inventé par le mathématicien John Horton Conway au début des années 70.
Le jeu de la vie se présente sous la forme d'un tableau (matrice) dont chaque case peut contenir
ou non une «!cellule!».
Tout se passe ainsi : à chaque génération, l'état de chaque case à la génération suivante est décidé
en fonction de son état et du nombre de cellules qui l'entourent!(entre 0 et 8) :
•
•
une cellule vivante ne survivra que si elle a 2 ou 3 voisines précisement (elle ne doit être
ni isolée ni étouffée).
une cellule apparaît dans une case vide à la génération suivante, si et seulement si cette
case est entourée de précisément 3 cellules (car il faut de la vie pour engendrer la vie).
En résumé : 2 ou 3 voisines pour survivre, 3 pour naître.
Exemple
(source!: la page de Thomas Morin!: http://t0m.free.fr/jdlv/jdlv.htm,)
But du TP
Écrire une applet Java qui, à partir d’une situation de départ, produit les générations successives
selon les règles du jeu de la vie.
L’applet devra être munie d’un bouton «!suivant!» qui calcule et dessine la génération suivante.
On peut voir un exemple sur la page (http://cui.unige.ch/isi/cours/std/exe03/tp4/exemple.html)
Pour représenter la surface du jeu on utilisera un tableau bidimensionnel de booléens
int DIM = 30
boolean jeu[][] = new boolean[30][30]
Attention, le calcul de la génération suivante ne peut pas se faire directement dans le tableau car
il ne faut pas modifier le jeu pendant qu’on calcule la nouvelle génération. On utilisera donc un
tableau auxiliaire.
Structure de l’applet
Comme l’applet doit gérer un bouton, elle doit avoir la structure suivante :
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class JeuDeLaVie extends Applet implements ActionListener {
Button bn!;
boolean [][] jeu!;
public void init() {
// création du bouton et ajout de celui-ci à l’applet
add(bn = new Button ("Suivant"));
// inscrit l’applet comme écouteur de ce bouton
bn.addActionListener(this);
// initialisation de jeu ...
}
public void paint(Graphics g) {
// dessine la surface de jeu à partir du contenu de jeu[][]
}
public void actionPerformed(ActionEvent e) {
// calcule un nouvelle génération dans jeu[][]
repaint();
}
Raffinement!: ajouter/supprimer des cellules en cliquant avec la
souris
Pour pouvoir capter les clics souris il faut implémenter l’interface MouseListener et donc
modifier l’entête de la class comme suit!:
public class JeuDeLaVie extends Applet implements ActionListener, MouseListener
{
L’applet doit avoir les méthodes suivantes (même si elles ne font rien):
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
Dans la méthode mouseClicked(MouseEvent e) ont peut récupérer les coordonnées de la souris
avec e.getX() et e.getY(). Il faut ensuite calculer quelle est la case du jeu qui correspond à cette
coordonnée écran.
Attention. Dans init() il faut ajouter
this.addMouseListener(this)
pour dire que l’applet «!écoute!» les évènements produits par la souris.
Tout cela est expliqué sur http://cui.unige.ch/java dans «!Notes de cours!» --> «!Interagir!» et par
les exemples d’applets «!interagir!».
Téléchargement