From f6316ed56c0b5f77dffa5ef40fce1146a88926b1 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 30 Nov 2010 13:20:43 +0100 Subject: [PATCH] finished conways game of life --- bin/conway | Bin 20908 -> 21444 bytes src/conway.c | 215 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 142 insertions(+), 73 deletions(-) diff --git a/bin/conway b/bin/conway index dbd0aff72b4e21fa48f86361a9a74f78ed3cedb2..ecf4f96aca25c2dfe47208d6ccfe2622aac187db 100755 GIT binary patch literal 21444 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 + * @copyright Copyright (c) 2010, Steffen Vogel + * @license http://opensource.org/licenses/gpl-license.php GNU Public License + */ + #include #include #include @@ -6,22 +16,12 @@ #include /* configuration */ -#define CELL_CHAR '#' -#define CURSOR_CHAR 'X' -#define ESC 27 -#define FRAME_RATE 17 +#define CURSOR_CHAR '#' -/* start pattern */ -uint8_t start[3][3] = { - {0, 1, 1}, - {1, 1, 0}, - {0, 1, 0} -}; - -uint8_t glider[3][3] = { - {0, 1, 0}, - {0, 0, 1}, - {1, 1, 1} +struct pattern { + uint8_t width; + uint8_t height; + uint8_t * data; }; struct cursor { @@ -29,30 +29,56 @@ struct cursor { uint8_t y; }; +uint8_t start[3][3] = { + {0, 1, 1}, + {1, 1, 0}, + {0, 1, 0} +}; + +uint8_t glider[3][3] = { + {0, 1, 0}, + {0, 0, 1}, + {1, 1, 1} +}; + +uint8_t segler[4][5] = { + {0, 1, 1, 1, 1}, + {1, 0, 0, 0, 1}, + {0, 0, 0, 0, 1}, + {1, 0, 0, 1, 0} +}; + +uint8_t buffer[7][3] = { + {1, 1, 1}, + {1, 0, 1}, + {1, 0, 1}, + {0, 0, 0}, + {1, 0, 1}, + {1, 0, 1}, + {1, 1, 1} +}; + +/* initialize world with zero (dead cells) */ void clean_world(uint8_t ** world, uint8_t width, uint8_t height) { - int a; - for (a = 0; a < width; a++) { + int a; + for (a = 0; a < width; a++) { memset(world[a], 0, height * sizeof(uint8_t)); } } +/* allocate memory for world */ 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; } +/* free memory for world */ void destroy_world(uint8_t ** world, uint8_t width) { uint8_t a; @@ -62,16 +88,18 @@ void destroy_world(uint8_t ** world, uint8_t width) { free(world); } -void inhabit_world(uint8_t pattern[3][3], uint8_t x, uint8_t y, uint8_t ** world) { +/* insert pattern at (x|y) into world */ +void inhabit_world(struct pattern pattern, 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++) { - world[x+b][y+a] = pattern[a][b]; + for (a = 0; a < pattern.height; a++) { + for (b = 0; b < pattern.width; b++) { + world[x+b][y+a] = pattern.data[(a*pattern.width)+b]; } } } +/* calc alive cells */ uint8_t calc_cell_count(uint8_t ** world, uint8_t width, uint8_t height) { int cell_count = 0; uint8_t a, b; @@ -90,18 +118,21 @@ uint8_t calc_cell_neighbours(uint8_t x, uint8_t y, uint8_t ** world, uint8_t wid int a, b; for (a = x-1; a <= x+1; a++) { - for (b = y-1; b <= y+1; b++) { - if (a == x && b == y) - continue; + int c = a; + if (a < 0) c += width; + if (a >= width) c -= width; - if (a >= 0 && b >= 0 && - a < width && b < height) { - neighbours += (world[a][b] > 0) ? 1 : 0; - } + for (b = y-1; b <= y+1; b++) { + int d = b; + if (a == x && b == y) continue; + if (b < 0) d += height; + if (b >= height) d -= height; + + neighbours += (world[c][d] > 0) ? 1 : 0; } } - return neighbours; + return neighbours; /* 0 <= neighbours <= 8 */ } uint8_t calc_next_cell_gen(uint8_t x, uint8_t y, uint8_t ** world, uint8_t width, uint8_t height) { @@ -113,15 +144,15 @@ uint8_t calc_next_cell_gen(uint8_t x, uint8_t y, uint8_t ** world, uint8_t width if (neighbours > 3 || neighbours < 2) { return 0; /* died by over-/underpopulation */ } - else { - return neighbours; + else { + return 1; /* kept alive */ } } else if (neighbours == 3) { - return neighbours; + return 1; /* born */ } else { - return 0; + return 0; /* still dead */ } } @@ -142,6 +173,7 @@ void calc_next_gen(uint8_t ** world, uint8_t ** next_gen, uint8_t width, uint8_t } } +/* print world with colors and count of neighbours */ void print_world(uint8_t ** world, uint8_t width, uint8_t height) { uint8_t x, y; move(0, 0); /* reset cursor */ @@ -149,20 +181,23 @@ void print_world(uint8_t ** world, uint8_t width, uint8_t height) { /* cells */ for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { - printw("%c", (world[x][y] > 0) ? CELL_CHAR : ' '); + uint8_t neighbours = calc_cell_neighbours(x, y, world, width, height); + + if (neighbours > 1) attron(COLOR_PAIR(neighbours)); + addch((world[x][y]) ? '0' + neighbours : ' '); + if (neighbours > 1) attroff(COLOR_PAIR(neighbours)); } } } void print_cursor(uint8_t ** world, struct cursor cur) { - uint8_t color = (world[cur.x][cur.y] + uint8_t color = (world[cur.x][cur.y]) ? 7 : 6; move(cur.y, cur.x); - attron(COLOR_PAIR(1)); - addch(CURSOR_CHAR); - attroff(COLOR_PAIR(1)); + addch(CURSOR_CHAR | A_BLINK | A_BOLD | A_STANDOUT | COLOR_PAIR(color)); } +/* set up ncurses screen */ WINDOW * init_screen() { WINDOW * win = initscr(); noecho(); @@ -171,9 +206,18 @@ WINDOW * init_screen() { 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); + init_color(COLOR_CYAN, 500, 1000, 0); /* redefine as orange */ + + init_pair(1, COLOR_BLACK, COLOR_WHITE); + init_pair(2, COLOR_WHITE, COLOR_BLACK); + init_pair(3, COLOR_GREEN, COLOR_BLACK); + init_pair(4, COLOR_YELLOW, COLOR_BLACK); + init_pair(5, COLOR_CYAN, COLOR_BLACK); + init_pair(6, COLOR_BLUE, COLOR_BLACK); + init_pair(7, COLOR_MAGENTA, COLOR_BLACK); + init_pair(8, COLOR_RED, COLOR_BLACK); return win; } @@ -182,46 +226,71 @@ int main(int argc, char * argv[]) { WINDOW * win = init_screen(); MEVENT event; + /* predefined patterns */ + struct pattern patterns[] = { + {3, 3, (uint8_t *) start}, + {3, 3, (uint8_t *) glider}, + {5, 4, (uint8_t *) segler}, + {3, 7, (uint8_t *) buffer} + }; struct cursor cur = {0, 0}; - int generation = 0; - uint8_t width, height, paused = 1; - uint8_t ** world, ** next_gen; - - getmaxyx(win, height, width); + int generation = 0, input, framerate = 17; + uint8_t width, height, paused = 0; /* initialize world */ - world = create_world(width, height); - next_gen = create_world(width, height); - - inhabit_world(start, width/2, height/2, world); + getmaxyx(win, height, width); + uint8_t ** worlds[2] = { + create_world(width, height), /* current generation */ + create_world(width, height) /* next generation */ + }, ** world = worlds[0]; + inhabit_world(patterns[3], width/2, height/2, worlds[0]); /* simulation loop */ while(1) { + /* calc next generation */ + if (!paused) { + usleep(1 / (float) framerate * 1000000); /* sleep */ + calc_next_gen(world, worlds[++generation % 2], width, height); + world = worlds[generation % 2]; /* new world */ + } + /* handle events */ - switch (getch()) { - case 'q': + switch (input = getch()) { + case '+': /* increase framerate */ + framerate++; + break; + + case '-': /* decrease framerate */ + if (framerate > 1) framerate--; + break; + + case 'q': /* quit */ endwin(); exit(0); break; - case 'p': + case 'p': /* pause */ paused ^= 1; break; - case 'c': + case 'c': /* clean world */ clean_world(world, width, height); + generation = 0; break; - case 'g': - inhabit_world(glider, cur.x, cur.y, world); + case '0': /* insert pattern */ + case '1': + case '2': + case '3': + inhabit_world(patterns[input - '0'], cur.x, cur.y, world); break; - case ' ': + case ' ': /* toggle cell at cursor position */ world[cur.x][cur.y] = (world[cur.x][cur.y]) ? 0 : 1; break; - case KEY_MOUSE: + case KEY_MOUSE: /* move cursor to mouse posititon */ if (getmouse(&event) == OK && event.bstate & BUTTON1_CLICKED) { cur.x = event.x; cur.y = event.y; @@ -254,23 +323,23 @@ int main(int argc, char * argv[]) { break; } - if (!paused) { - usleep((float) 1 / FRAME_RATE * 1000000); /* sleep */ - calc_next_gen(world, next_gen, width, height); - generation++; - } - + /* update screen */ 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); + attron(COLOR_PAIR(1)); + 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), framerate, width, height, cur.x, cur.y); if (paused) mvprintw(0, width-6, "PAUSED"); - attroff(COLOR_PAIR(2)); + attroff(COLOR_PAIR(1)); refresh(); } - endwin(); + /* householding */ + destroy_world(worlds[0], width); + destroy_world(worlds[1], width); + + endwin(); /* exit ncurses mode */ + return 0; }