(main)+state data structure and iteration logic

Per iteration, increment the centre of the grid, and perform any
collapsing necessary (if >= 4 then sand pile "collapses" onto its
cardinal directions).
This commit is contained in:
2023-08-25 18:42:49 +01:00
parent 0d25b2b78e
commit e6fc32ef08

51
main.c
View File

@@ -3,22 +3,67 @@
* Author: Aryadev Chavali * Author: Aryadev Chavali
* Description: Entry point of program * Description: Entry point of program
*/ */
#include <malloc.h>
#include <stdio.h> #include <stdio.h>
#include <raylib.h> #include <raylib.h>
#define WIDTH 512 struct State
#define HEIGHT 512 {
// Sandpiles
unsigned char *data;
size_t dwidth;
size_t window_len;
int multiplier;
};
typedef struct State state_t;
void step(state_t *state)
{
state->data[((state->dwidth / 2) * state->dwidth) + (state->dwidth / 2)]++;
for (size_t i = 0; i < state->dwidth; ++i)
for (size_t j = 0; j < state->dwidth; ++j)
if (state->data[(i * state->dwidth) + j] >= 4)
{
unsigned char *references[] = {
(j == 0) ? NULL : &state->data[((i)*state->dwidth) + j - 1],
(i == state->dwidth - 1)
? NULL
: &state->data[((i + 1) * state->dwidth) + j],
(j == state->dwidth - 1)
? NULL
: &state->data[(i * state->dwidth) + j + 1],
(i == 0) ? NULL : &state->data[((i - 1) * state->dwidth) + j]};
for (size_t k = 0; k < 4; ++k)
if (references[k])
*references[k] += 1;
state->data[(i * state->dwidth) + j] = 0;
}
}
int main(void) int main(void)
{ {
InitWindow(WIDTH, HEIGHT, "Abelian sand pile"); state_t state = {NULL, 256, 512, 0};
state.data = calloc(state.dwidth * state.dwidth, sizeof(*state.data));
state.multiplier = state.window_len / state.dwidth;
InitWindow(state.window_len, state.window_len, "Abelian sand pile");
SetTargetFPS(60); SetTargetFPS(60);
while (!WindowShouldClose()) while (!WindowShouldClose())
{ {
step(&state);
BeginDrawing(); BeginDrawing();
ClearBackground(BLACK); ClearBackground(BLACK);
DrawText("Hello, world!", 100, 100, 25, RAYWHITE); DrawText("Hello, world!", 100, 100, 25, RAYWHITE);
for (size_t i = 0; i < state.dwidth; ++i)
for (size_t j = 0; j < state.dwidth; ++j)
{
DrawRectangle(i * state.multiplier, j * state.multiplier,
state.multiplier, state.multiplier, BLACK);
}
EndDrawing(); EndDrawing();
} }
CloseWindow(); CloseWindow();