Le «jeu de la vie»
Transcription
Le «jeu de la vie»
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!».