Logo AND Algorithmique Numérique Distribuée

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