Это еще одна вариация клеточного автомата, наподобие игры "Жизнь". В этот раз, в отличии от Conway's Game of Life, здесь работает несколько иначе.
Проверяется каждая клетка. Если в клетке – пиксель, который означает что это песок (6, 14 или 15 номер цвета), то проверяем далее
Проверяем клетку снизу – если она пустая, то удаляем пиксель и перемещаем вниз
Если нижняя клетка не пустая, но слева и справа (внизу) обе клетки пустые – выбираем случайным образом, куда переместить текущую клетку и перемещаем
Если либо слева пусто, либо справа – то перемещаем клетку в эту пустую область
Во всех остальных случаях с клеткой ничего не делаем. И еще важный момент чтобы все модификации записывались в новое поле, а потом, после вывода на экран, новое поле копировалось в старое.
Ниже: реализация алгоритма на Си с использованием QBLib.h (см. секцию "Шаблоны").
§ Программный код
#include <qblib.h>
int buf[2][320][200];
void load();
void seed();
void frame();
// Точка входа
int main(int argc, char** argv)
{
screen();
load();
while (loop()) {
seed();
frame();
}
return quit();
}
void load()
{
// Инициализация
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;