From 3147b711e9e0b9c094fbcdc08a1b4fb8f0b13f6e Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 29 Nov 2010 15:00:41 +0100 Subject: [PATCH] finished conway --- bin/conway | Bin 0 -> 20908 bytes src/conway.c | 295 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 217 insertions(+), 78 deletions(-) create mode 100755 bin/conway diff --git a/bin/conway b/bin/conway new file mode 100755 index 0000000000000000000000000000000000000000..dbd0aff72b4e21fa48f86361a9a74f78ed3cedb2 GIT binary patch literal 20908 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 #include +#include #include #include +#include /* configuration */ #define CELL_CHAR '#' #define CURSOR_CHAR 'X' -#define WIDTH 80 -#define HEIGHT 24 #define ESC 27 -#define FRAME_RATE 5 +#define FRAME_RATE 17 -void clear_screen() { - printf("%c[2J", ESC); -} +/* start pattern */ +uint8_t start[3][3] = { + {0, 1, 1}, + {1, 1, 0}, + {0, 1, 0} +}; -void set_cursor(int row, int col) { - printf("%c[%d;%dH", ESC, row, col); -} +uint8_t glider[3][3] = { + {0, 1, 0}, + {0, 0, 1}, + {1, 1, 1} +}; -void clean_world(uint8_t world[WIDTH][HEIGHT]) { - size_t a, b; +struct cursor { + uint8_t x; + uint8_t y; +}; - for (a = 0; a < WIDTH; a++) { - for (b = 0; b < HEIGHT; b++) { - world[a][b] = 0; - } +void clean_world(uint8_t ** world, uint8_t width, uint8_t height) { + int a; + for (a = 0; a < width; a++) { + memset(world[a], 0, height * sizeof(uint8_t)); } } -void inhabit_world(uint8_t pattern[3][3], size_t x, size_t y, uint8_t world[WIDTH][HEIGHT]) { - size_t a, b; +uint8_t ** create_world(uint8_t width, uint8_t height) { + uint8_t ** world = malloc(width * sizeof(uint8_t *)); + int a; + for (a = 0; a < width; a++) { + world[a] = malloc(height * sizeof(uint8_t)); + if (world[a] == NULL) { + endwin(); + fprintf(stderr, "Cant allocate memory!\n"); + exit(-1); + } + } + + clean_world(world, width, height); + + return world; +} + +void destroy_world(uint8_t ** world, uint8_t width) { + uint8_t a; + + for (a = 0; a < width; a++) { + free(world[a]); + } + free(world); +} + +void inhabit_world(uint8_t pattern[3][3], uint8_t x, uint8_t y, uint8_t ** world) { + uint8_t a, b; for (a = 0; a < 3; a++) { for (b = 0; b < 3; b++) { @@ -39,14 +72,31 @@ void inhabit_world(uint8_t pattern[3][3], size_t x, size_t y, uint8_t world[WIDT } } -uint8_t calc_cell_neighbours(size_t x, size_t y, uint8_t world[WIDTH][HEIGHT]) { +uint8_t calc_cell_count(uint8_t ** world, uint8_t width, uint8_t height) { + int cell_count = 0; + uint8_t a, b; + + for (a = 0; a < width; a++) { + for (b = 0; b < height; b++) { + cell_count += (world[a][b]) ? 1 : 0; + } + } + + return cell_count; +} + +uint8_t calc_cell_neighbours(uint8_t x, uint8_t y, uint8_t ** world, uint8_t width, uint8_t height) { uint8_t neighbours = 0; - int8_t a, b; + int a, b; for (a = x-1; a <= x+1; a++) { for (b = y-1; b <= y+1; b++) { - if (a >= 0 && b >= 0 && a != x && b != y && world[a][b] > 0) { - neighbours++; + if (a == x && b == y) + continue; + + if (a >= 0 && b >= 0 && + a < width && b < height) { + neighbours += (world[a][b] > 0) ? 1 : 0; } } } @@ -54,84 +104,173 @@ uint8_t calc_cell_neighbours(size_t x, size_t y, uint8_t world[WIDTH][HEIGHT]) { return neighbours; } -uint8_t calc_next_cell_gen(size_t x, size_t y, uint8_t world[WIDTH][HEIGHT]) { - uint8_t neighbours = calc_cell_neighbours(x, y, world); +uint8_t calc_next_cell_gen(uint8_t x, uint8_t y, uint8_t ** world, uint8_t width, uint8_t height) { + fflush(stdout); + uint8_t neighbours = calc_cell_neighbours(x, y, world, width, height); + uint8_t alive = world[x][y]; - if (neighbours < 2) { - return 0; + if (alive) { + if (neighbours > 3 || neighbours < 2) { + return 0; /* died by over-/underpopulation */ + } + else { + return neighbours; + } } - else if (neighbours > 3) { - return 0; - } - else if (neighbours == 2 || neighbours == 3) { - return 1; + else if (neighbours == 3) { + return neighbours; } else { - return -1; + return 0; } } -void calc_next_gen(uint8_t world[WIDTH][HEIGHT]) { - uint8_t next_gen[WIDTH][HEIGHT]; - size_t x, y; +void calc_next_gen(uint8_t ** world, uint8_t ** next_gen, uint8_t width, uint8_t height) { + uint8_t x, y; - clean_world(next_gen); - - for (x = 0; x < WIDTH; x++) { - for (y = 0; y < HEIGHT; y++) { - next_gen[x][y] = calc_next_cell_gen(x, y, world); + for (x = 0; x < width; x++) { + for (y = 0; y < height; y++) { + next_gen[x][y] = calc_next_cell_gen(x, y, world, width, height); } } - memcpy(world, next_gen, WIDTH*HEIGHT); -} - -void print_world(uint8_t world[WIDTH][HEIGHT]) { - size_t x, y; - - /* reset cursor */ - set_cursor(0, 0); - - for (y = 0; y < HEIGHT; y++) { - for (x = 0; x < WIDTH; x++) { - /*printf("%c", (world[x][y]) ? CELL_CHAR : ' ');*/ - printf("%d,", (world[x][y] != 0) ? (int) world[x][y] : ' '); + /* copy world */ + for (x = 0; x < width; x++) { + for (y = 0; y < height; y++) { + world[x][y] = next_gen[x][y]; } - printf("\n"); /* new line */ - } - - for (y = 0; y < HEIGHT; y++) { - printf("|"); - for (x = 0; x < WIDTH; x++) { - printf("%c", (world[x][y]) ? CELL_CHAR : ' '); - } - printf("|\n"); /* new line */ } } -/* start pattern */ -uint8_t glider[3][3] = { - {0, 1, 0}, - {0, 0, 1}, - {1, 1, 1} -}; +void print_world(uint8_t ** world, uint8_t width, uint8_t height) { + uint8_t x, y; + move(0, 0); /* reset cursor */ + + /* cells */ + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + printw("%c", (world[x][y] > 0) ? CELL_CHAR : ' '); + } + } +} + +void print_cursor(uint8_t ** world, struct cursor cur) { + uint8_t color = (world[cur.x][cur.y] + + move(cur.y, cur.x); + attron(COLOR_PAIR(1)); + addch(CURSOR_CHAR); + attroff(COLOR_PAIR(1)); +} + +WINDOW * init_screen() { + WINDOW * win = initscr(); + noecho(); + timeout(0); + keypad(win, 1); + mousemask(BUTTON1_CLICKED, NULL); + mouseinterval(200); + curs_set(0); + start_color(); + init_pair(1, COLOR_RED, COLOR_BLACK); + init_pair(2, COLOR_GREEN, COLOR_BLACK); + + return win; +} int main(int argc, char * argv[]) { - uint8_t world[WIDTH][HEIGHT]; - int counter = 0; + WINDOW * win = init_screen(); + MEVENT event; - clean_world(world); /* initialize world */ - inhabit_world(glider, WIDTH/2, HEIGHT/2, world); /* inhabit world */ - clear_screen(); -print_world(world); + struct cursor cur = {0, 0}; + + int generation = 0; + uint8_t width, height, paused = 1; + uint8_t ** world, ** next_gen; + + getmaxyx(win, height, width); + + /* initialize world */ + world = create_world(width, height); + next_gen = create_world(width, height); + + inhabit_world(start, width/2, height/2, world); /* simulation loop */ - while(0) { - calc_next_gen(world); - print_world(world); - usleep((float) 1 / FRAME_RATE * 1000000); /* sleep */ - printf("frame: %d\n", counter++); + while(1) { + /* handle events */ + switch (getch()) { + case 'q': + endwin(); + exit(0); + break; + + case 'p': + paused ^= 1; + break; + + case 'c': + clean_world(world, width, height); + break; + + case 'g': + inhabit_world(glider, cur.x, cur.y, world); + break; + + case ' ': + world[cur.x][cur.y] = (world[cur.x][cur.y]) ? 0 : 1; + break; + + case KEY_MOUSE: + if (getmouse(&event) == OK && event.bstate & BUTTON1_CLICKED) { + cur.x = event.x; + cur.y = event.y; + world[cur.x][cur.y] = (world[cur.x][cur.y]) ? 0 : 1; + } + break; + + case KEY_UP: + if (cur.y > 0) { + cur.y--; + } + break; + + case KEY_DOWN: + if (cur.y < height-1) { + cur.y++; + } + break; + + case KEY_LEFT: + if (cur.x > 0) { + cur.x--; + } + break; + + case KEY_RIGHT: + if (cur.x < width-1) { + cur.x++; + } + break; + } + + if (!paused) { + usleep((float) 1 / FRAME_RATE * 1000000); /* sleep */ + calc_next_gen(world, next_gen, width, height); + generation++; + } + + print_world(world, width, height); + print_cursor(world, cur); + + attron(COLOR_PAIR(2)); + mvprintw(0, 0, "generation: %d\tcells: %d framerate: %d fps\twidth: %d\theight: %d cursor: (%d|%d)\n", generation, calc_cell_count(world, width, height), FRAME_RATE, width, height, cur.x, cur.y); + if (paused) mvprintw(0, width-6, "PAUSED"); + attroff(COLOR_PAIR(2)); + + refresh(); } + endwin(); return 0; }