§ Демонстрация

Demo: Анимация падающего песка сверху вниз

§ Код

1#include <qblib.c>
2
3int main(int argc, char* argv[]) {
4
5    screen(13);
6
7    int buf[2][320][200];
8
9    // Инициализация
10    for (int i = 0; i < 2; i++)
11    for (int y = 0; y < 200; y++)
12    for (int x = 0; x < 320; x++)
13        buf[i][x][y] = 0;
14
15    // Генератор блока
16    for (int y = 160; y < 200; y++) for (int x = 40; x < 100; x++) buf[1][x][y] = 7;
17    for (int y = 100; y < 108; y++) for (int x = 160; x < 250; x++) buf[1][x][y] = 7;
18
19    float t = 0;
20    while (sdlevent(EVT_REDRAW)) {
21
22        // Генерация нового песка
23        int cx = (int)(160 + sin(t)*100) + rand()%64 - 32;
24        buf[0][ cx ][0] = rand()&1 ? 6 : 14;
25        t += 0.1;
26
27        // Клеточный автомат
28        for (int y = 0; y < 199; y++)
29        for (int x = 1; x < 319; x++) {
30
31            int p = buf[0][x][y];
32            int m = 0, dx = 0, dy = 0;
33
34            // Движение песка
35            if (p == 6 || p == 14) {
36
37                int a = buf[0][x-1][y+1];
38                int b = buf[0][x  ][y+1];
39                int c = buf[0][x+1][y+1];
40
41                // Обработка следующего положения песка
42                if (b == 0) { m = 1; dx = 0; dy = 1; }
43                else if (a == 0 && c == 0) { m = 1; dy = 1; dx = rand()&1 ? 1 : - 1; }
44                else if (a == 0) { m = 1; dx = -1; dy = 1; }
45                else if (c == 0) { m = 1; dx =  1; dy = 1; }
46
47                // Есть перемещение песка
48                if (m) {
49
50                    buf[1][x][y] = 0;
51                    buf[1][x+dx][y+dy] = p;
52                }
53            }
54        }
55
56        // Перенести
57        for (int y = 0; y < 200; y++)
58        for (int x = 0; x < 320; x++) {
59            buf[0][x][y] = buf[1][x][y];
60            pset(x, y, buf[0][x][y]);
61        }
62    }
63
64    return 0;
65}

§ Скриншот