§ Демонстрация
Demo: Анимация падающего песка сверху вниз
§ Код
#include <qblib.c> int main(int argc, char* argv[]) { screen(13); int buf[2][320][200]; // Инициализация for (int i = 0; i < 2; i++) for (int y = 0; y < 200; y++) for (int x = 0; x < 320; x++) buf[i][x][y] = 0; // Генератор блока for (int y = 160; y < 200; y++) for (int x = 40; x < 100; x++) buf[1][x][y] = 7; for (int y = 100; y < 108; y++) for (int x = 160; x < 250; x++) buf[1][x][y] = 7; float t = 0; while (sdlevent(EVT_REDRAW)) { // Генерация нового песка int cx = (int)(160 + sin(t)*100) + rand()%64 - 32; buf[0][ cx ][0] = rand()&1 ? 6 : 14; t += 0.1; // Клеточный автомат for (int y = 0; y < 199; y++) for (int x = 1; x < 319; x++) { int p = buf[0][x][y]; int m = 0, dx = 0, dy = 0; // Движение песка if (p == 6 || p == 14) { int a = buf[0][x-1][y+1]; int b = buf[0][x ][y+1]; int c = buf[0][x+1][y+1]; // Обработка следующего положения песка if (b == 0) { m = 1; dx = 0; dy = 1; } else if (a == 0 && c == 0) { m = 1; dy = 1; dx = rand()&1 ? 1 : - 1; } else if (a == 0) { m = 1; dx = -1; dy = 1; } else if (c == 0) { m = 1; dx = 1; dy = 1; } // Есть перемещение песка if (m) { buf[1][x][y] = 0; buf[1][x+dx][y+dy] = p; } } } // Перенести for (int y = 0; y < 200; y++) for (int x = 0; x < 320; x++) { buf[0][x][y] = buf[1][x][y]; pset(x, y, buf[0][x][y]); } } return 0; }