Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
4acc4a8bce7e46b7ee8ec735cea04ca89fcc81f3
[graphlib_java.git] / MoreEx / JeuDeLaVie.java
1 import java.util.*;
2
3 class JeuDeLaVie {
4
5     static final Random random = new Random();
6
7     static final int LARGEUR = 1200;
8     static final int HAUTEUR = 900;
9
10     static final int VIVANT = 0x000000ff; // bleu
11     static final int MORT   = 0x00ffffff; // blanc
12
13     static class Cell {
14         int neigh;
15         boolean now;
16         boolean next;
17     };
18     static Cell[][] cells;
19
20     static void majVoisins(int i, int j, int delta)
21     {
22         for (int k = i - 1 ; k <= i + 1 ; ++k)
23             for (int l = j - 1 ; l <= j + 1 ; ++l)
24                 if (k != i || l != j) {
25                     int vi = (k + LARGEUR) % LARGEUR;
26                     int vj = (l + HAUTEUR) % HAUTEUR;
27                     cells[vi][vj].neigh += delta;
28                 }
29     }
30
31     static void dessine(DrawingWindow w, int i, int j, int couleur)
32     {
33         w.setColor(couleur);
34         w.drawPoint(i, j);
35     }
36
37     static void init(DrawingWindow w)
38     {
39         cells = new Cell[LARGEUR][HAUTEUR];
40         for (int i = 0 ; i < LARGEUR ; ++i)
41             for (int j = 0 ; j < HAUTEUR ; ++j)
42                 cells[i][j] = new Cell();
43         for (int i = 0 ; i < LARGEUR ; ++i)
44             for (int j = 0 ; j < HAUTEUR ; ++j)
45                 cells[i][j].neigh = 0;
46         for (int i = 0 ; i < LARGEUR ; ++i)
47             for (int j = 0 ; j < HAUTEUR ; ++j) {
48                 cells[i][j].now = cells[i][j].next = random.nextBoolean();
49                 if (cells[i][j].now) {
50                     majVoisins(i, j, 1);
51                     dessine(w, i, j, VIVANT);
52                 }
53             }
54     }
55
56     static void update0(DrawingWindow w)
57     {
58         for (int i = 0 ; i < LARGEUR ; ++i)
59             for (int j = 0 ; j < HAUTEUR ; ++j) {
60                 switch (cells[i][j].neigh) {
61                 case 2:
62                     // cells[i][j].next = cells[i][j].now; // useless
63                     break;
64                 case 3:
65                     cells[i][j].next = true;
66                     break;
67                 default:
68                     cells[i][j].next = false;
69                     break;
70                 }
71             }
72     }
73     static void update1(DrawingWindow w)
74     {
75         for (int i = 0 ; i < LARGEUR ; ++i)
76             for (int j = 0 ; j < HAUTEUR ; ++j) {
77                 if (cells[i][j].now) {
78                     if (!cells[i][j].next) {
79                         cells[i][j].now = false;
80                         majVoisins(i, j, -1);
81                         dessine(w, i, j, MORT);
82                     }
83                 } else {
84                     if (cells[i][j].next) {
85                         cells[i][j].now = true;
86                         majVoisins(i, j, 1);
87                         dessine(w, i, j, VIVANT);
88                     }
89                 }
90             }
91     }
92
93     public static void main(String[] args) {
94         DrawingWindow w = new DrawingWindow("Jeau de la vie", LARGEUR, HAUTEUR);
95         w.setBgColor(MORT);
96         w.clearGraph();
97         init(w);
98         w.sync();
99         for (int gen = 0 ; ; ++gen) {
100             if (gen % 10 == 0)
101                 System.err.println("generation " + gen);
102             update0(w);
103             update1(w);
104             w.sync();
105         }
106     }
107 }