diff options
-rw-r--r-- | sources/main.c | 128 |
1 files changed, 84 insertions, 44 deletions
diff --git a/sources/main.c b/sources/main.c index 7d19cf1..136feac 100644 --- a/sources/main.c +++ b/sources/main.c @@ -2,37 +2,76 @@ #include <stdlib.h> #include <time.h> #include <string.h> +#include <stdio.h> + +typedef struct { + int width; + int height; + int **data; +} State; + +void initializeState(State *state) { + state->data = malloc(state->height * sizeof (int *)); + for (int i=0; i < state->height; i++) { + int *row = malloc(state->width * sizeof (int)); + for (int j=0; j < state->width; j++) { + row[j] = 0; + } + state->data[i] = row; + } +} + +void copyState(State *dest, State *src) { + for(int i=0; i<dest->height; i++) { + int *destRow = dest->data[i]; + int *srcRow = src->data[i]; + memcpy(destRow, srcRow, dest->width * sizeof(int)); + } +} + +void freeStateData(State *state) { + for (int i=0; i < state->height; i++) { + free(state->data[i]); + } + free(state->data); +} + +void printState(State *state) { + for (int i=0; i<state->height; i++) { + for (int j=0; j<state->width; j++) { + printf("%d ", state->data[i][j]); + } + printf("\n"); + } +} int main(void) { const int pixSize = 5; const int padding = 2; - const int dim = 80; + const int height = 80; + const int width = 100; const int space = pixSize + (2 * padding); - const int winSize = space * dim; + const int winHeight = space * height; + const int winWidth = space * width; - bool (*currState)[dim]; - bool (*nextState)[dim]; - currState = malloc(dim * dim * sizeof(bool)); - nextState = malloc(dim * dim * sizeof(bool)); + State currState = {.height = height, .width = width}; + initializeState(&currState); + State nextState = {.height = height, .width = width}; + initializeState(&nextState); srand(time(NULL)); int prob = 30; - for (int i=0; i<dim; i++) { - for (int j=0; j<dim; j++) { - currState[i][j] = false; - nextState[i][j] = false; + for (int i=0; i<height; i++) { + for (int j=0; j<width; j++) { if (rand() % 100 < prob) { - currState[i][j] = true; - nextState[i][j] = true; - } else { - currState[i][j] = false; - nextState[i][j] = false; + currState.data[i][j] = true; + nextState.data[i][j] = true; } } } - InitWindow(winSize, winSize, "Kontol"); + InitWindow(winWidth, winHeight, "Keren"); SetTargetFPS(10); bool isRunning = true; @@ -44,19 +83,20 @@ int main(void) isRunning = !isRunning; ClearBackground(BLACK); - int nearestI = GetMouseX() / space; - int nearestJ = GetMouseY() / space; + int nearestI = GetMouseY() / space; + int nearestJ = GetMouseX() / space; if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) - currState[nearestI][nearestJ] = true; + currState.data[nearestI][nearestJ] = true; if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) - currState[nearestI][nearestJ] = false; + currState.data[nearestI][nearestJ] = false; - for (int i=0; i<dim; i++) { - for (int j=0; j<dim; j++) { - Color pixColor = BLACK; - if (currState[i][j]) pixColor = WHITE; - DrawRectangle(i * space, j * space, pixSize, pixSize, pixColor); + for (int i=0; i<height; i++) { + for (int j=0; j<width; j++) { + printf("drawing row %d col %d\n", i, j); + Color pixColor = GRAY; + if (currState.data[i][j]) pixColor = WHITE; + DrawRectangle(j * space, i * space, pixSize, pixSize, pixColor); if (isRunning) { int n1 = 0; @@ -68,42 +108,42 @@ int main(void) int n7 = 0; int n8 = 0; if (i > 0 && j > 0) { - n1 = currState[i - 1][j - 1]; - n2 = currState[i - 1][j]; - n4 = currState[i][j - 1]; + n1 = currState.data[i - 1][j - 1]; + n2 = currState.data[i - 1][j]; + n4 = currState.data[i][j - 1]; } - if (i > 0 && j < dim-1) { - n3 = currState[i - 1][j + 1]; + if (i > 0 && j < width-1) { + n3 = currState.data[i - 1][j + 1]; } - if (i < dim-1 && j < dim-1) { - n5 = currState[i][j + 1]; - n7 = currState[i + 1][j]; + if (i < height-1 && j < width-1) { + n5 = currState.data[i][j + 1]; + n7 = currState.data[i + 1][j]; } - if (i < dim-1 && j > 0) { - n6 = currState[i + 1][j - 1]; + if (i < height-1 && j > 0) { + n6 = currState.data[i + 1][j - 1]; } - if (i < dim-1 && j < dim-1) { - n8 = currState[i + 1][j + 1]; + if (i < height-1 && j < width-1) { + n8 = currState.data[i + 1][j + 1]; } int total = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8; - if (total < 2 && currState[i][j]) nextState[i][j] = false; - if (total > 3 && currState[i][j]) nextState[i][j] = false; - if ((total == 2 || total == 3) && currState[i][j]) nextState[i][j] = true; - if (total == 3 && !currState[i][j]) nextState[i][j] = true; + if (total < 2 && currState.data[i][j]) nextState.data[i][j] = false; + if (total > 3 && currState.data[i][j]) nextState.data[i][j] = false; + if ((total == 2 || total == 3) && currState.data[i][j]) nextState.data[i][j] = true; + if (total == 3 && !currState.data[i][j]) nextState.data[i][j] = true; } } } if (isRunning) { - memcpy(currState, nextState, dim * dim * sizeof(bool)); + copyState(&currState, &nextState); } EndDrawing(); } - free(currState); - free(nextState); + freeStateData(&currState); + freeStateData(&nextState); CloseWindow(); |