Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
8f3ae87dbc6237eeb3ed94f045e8aa267f04817c
[graphlib.git] / jeudelavie / jeudelavie.cpp
1 #include <DrawingWindow.h>
2 #include <QApplication>
3 #include <iostream>
4
5 #define LARGEUR 213
6 #define HAUTEUR 160
7
8 #define TCELL 5                 // taille d'une cellule
9
10 #define BORDURE  0x00000000U    // noir
11 #define NAISSANT 0x0000ff00U    // vert
12 #define VIVANT   0x000000ffU    // bleu
13 #define MOURANT  0x00ff0000U    // rouge
14 #define MORT     0x00ffffffU    // blanc
15
16 bool cells[LARGEUR][HAUTEUR][2];
17
18 void init()
19 {
20     srand(time(NULL));
21     for (int i = 0 ; i < LARGEUR ; ++i)
22         for (int j = 0 ; j < HAUTEUR ; ++j)
23             cells[i][j][0] = cells[i][j][1] = (rand() < RAND_MAX / 2);
24 }
25
26 void draw(DrawingWindow& w)
27 {
28     for (int i = 0 ; i < LARGEUR ; ++i)
29         for (int j = 0 ; j < HAUTEUR ; ++j) {
30             if (cells[i][j][0] == cells[i][j][1])
31                 w.setColor(cells[i][j][1] ? VIVANT : MORT);
32             else
33                 w.setColor(cells[i][j][1] ? NAISSANT : MOURANT);
34             w.fillRect(TCELL * i + 1, TCELL * j + 1,
35                        TCELL * (i + 1) - 1, TCELL * (j + 1) - 1);
36             cells[i][j][0] = cells[i][j][1];
37         }
38 }
39
40 int nbVoisins(int i, int j)
41 {
42     int n = 0;
43     for (int k = i - 1 ; k <= i + 1 ; ++k)
44         for (int l = j - 1 ; l <= j + 1 ; ++l)
45             if (k != i || l != j) {
46                 int vi = (k + LARGEUR) % LARGEUR;
47                 int vj = (l + HAUTEUR) % HAUTEUR;
48                 if (cells[vi][vj][0])
49                     ++n;
50             }
51     return n;
52 }
53
54 void update()
55 {
56     for (int i = 0 ; i < LARGEUR ; ++i)
57         for (int j = 0 ; j < HAUTEUR ; ++j) {
58             int v = nbVoisins(i, j);
59             if (cells[i][j][0])
60                 cells[i][j][1] = (v == 2 || v == 3);
61             else
62                 cells[i][j][1] = (v == 3);
63         }
64 }
65
66 void jeudelavie(DrawingWindow& w)
67 {
68     w.setBgColor(BORDURE);
69     w.clearGraph();
70     init();
71     for (int gen = 0 ; ; ++gen) {
72         if (gen % 10 == 0)
73             std::cerr << "generation " << gen << std::endl;
74         w.sync();
75         draw(w);
76         update();
77     }
78 }
79
80 int main(int argc, char *argv[])
81 {
82     QApplication app(argc, argv);
83     DrawingWindow win(jeudelavie, TCELL * LARGEUR + 1, TCELL * HAUTEUR + 1);
84     win.show();
85     return app.exec();
86 }