Лисья Нора

Оглавление


§ Алгоритм песка

sandrop.gif
Это еще одна вариация клеточного автомата, наподобие игры "Жизнь". В этот раз, в отличии от Conway's Game of Life, здесь работает несколько иначе.
Во всех остальных случаях с клеткой ничего не делаем. И еще важный момент чтобы все модификации записывались в новое поле, а потом, после вывода на экран, новое поле копировалось в старое.
Ниже: реализация алгоритма на Си с использованием 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;
}
 
// Генерация нового песка
void seed()
{
int cx = (int)(160 + sin(_frame / 120.) * 120) + rand()%64 - 32;
int cl = 0;
 
// 25% коричневый 50% желтый 25% белый
switch (rand() & 3) {
case 0: cl = 6; break;
case 1:
case 2: cl = 14; break;
case 3: cl = 15; break;
}
 
buf[0][ cx ][0] = cl;
}
 
// Клеточный автомат
void frame()
{
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 || p == 15) {
 
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; dx = rand()&1 ? 1 : - 1; dy = 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]);
}
}