§ Демонстрация
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}