Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Recode.
[graphlib.git] / jeudelavie / jeudelavie.cpp
1 #include <DrawingWindow.h>
2 #include <QApplication>
3 #include <iostream>
4
5 #define LARGEUR 1200
6 #define HAUTEUR 900
7
8 #define VIVANT   0x000000ffU    // bleu
9 #define MORT     0x00ffffffU    // blanc
10
11 struct cell {
12     int neigh;
13     bool now;
14     bool next;
15 };
16 cell cells[LARGEUR][HAUTEUR];
17
18 void majVoisins(int i, int j, int delta)
19 {
20     for (int k = i - 1 ; k <= i + 1 ; ++k)
21         for (int l = j - 1 ; l <= j + 1 ; ++l)
22             if (k != i || l != j) {
23                 int vi = (k + LARGEUR) % LARGEUR;
24                 int vj = (l + HAUTEUR) % HAUTEUR;
25                 cells[vi][vj].neigh += delta;
26             }
27 }
28
29 void dessine(DrawingWindow& w, int i, int j, unsigned couleur)
30 {
31     w.setColor(couleur);
32     w.drawPoint(i, j);
33 }
34
35 void init(DrawingWindow& w)
36 {
37     srand(time(NULL));
38     for (int i = 0 ; i < LARGEUR ; ++i)
39         for (int j = 0 ; j < HAUTEUR ; ++j)
40             cells[i][j].neigh = 0;
41     for (int i = 0 ; i < LARGEUR ; ++i)
42         for (int j = 0 ; j < HAUTEUR ; ++j) {
43             cells[i][j].now = cells[i][j].next = (rand() < RAND_MAX / 2);
44             if (cells[i][j].now) {
45                 majVoisins(i, j, 1);
46                 dessine(w, i, j, VIVANT);
47             }
48         }
49 }
50
51 void update0(DrawingWindow& w __attribute__((unused)))
52 {
53     for (int i = 0 ; i < LARGEUR ; ++i)
54         for (int j = 0 ; j < HAUTEUR ; ++j) {
55             switch (cells[i][j].neigh) {
56             case 2:
57                 // cells[i][j].next = cells[i][j].now; // useless
58                 break;
59             case 3:
60                 cells[i][j].next = true;
61                 break;
62             default:
63                 cells[i][j].next = false;
64                 break;
65             }
66         }
67 }
68
69 void update1(DrawingWindow& w)
70 {
71     for (int i = 0 ; i < LARGEUR ; ++i)
72         for (int j = 0 ; j < HAUTEUR ; ++j) {
73             if (cells[i][j].now) {
74                 if (!cells[i][j].next) {
75                     cells[i][j].now = false;
76                     majVoisins(i, j, -1);
77                     dessine(w, i, j, MORT);
78                 }
79             } else {
80                 if (cells[i][j].next) {
81                     cells[i][j].now = true;
82                     majVoisins(i, j, 1);
83                     dessine(w, i, j, VIVANT);
84                 }
85             }
86         }
87 }
88
89 void jeudelavie(DrawingWindow& w)
90 {
91     w.setBgColor(MORT);
92     w.clearGraph();
93     init(w);
94     w.sync();
95     for (int gen = 0 ; ; ++gen) {
96         if (gen % 10 == 0)
97             std::cerr << "generation " << gen << std::endl;
98         update0(w);
99         update1(w);
100         w.sync();
101     }
102 }
103
104 int main(int argc, char *argv[])
105 {
106     QApplication app(argc, argv);
107     DrawingWindow win(jeudelavie, LARGEUR, HAUTEUR);
108     win.show();
109     return app.exec();
110 }