From: Laurent Mazet Date: Sun, 23 Jun 2024 21:17:27 +0000 (+0200) Subject: play mode fonctional X-Git-Tag: v1.0~18 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=a29e711431fa0a824987d11c51a1d372ba7b1361;p=gameoflife.git play mode fonctional --- diff --git a/gameoflife.c b/gameoflife.c index 9bc3cfa..b40cee6 100644 --- a/gameoflife.c +++ b/gameoflife.c @@ -24,12 +24,13 @@ char *progname = NULL; char *version = "0.1"; char *file = NULL; -char mode = '\0'; +char mode = 'e'; +int speed = 5; int xoffset = 1; int yoffset = 1; char *help = - "< > Next generation\n" + "< > Play generations\n" " Put cells\n" " Mirror up/down\n" " Rotate counter cw\n" @@ -47,11 +48,14 @@ char *help = int usage (int ret) { FILE *fd = ret ? stderr : stdout; - fprintf (fd, "usage: %s [-e file] [-h] [-p file] [-v level] [-x int] [-y int]\n", progname); + fprintf (fd, "usage: %s [-e file] [-h] [-p file] [-s tens] [-v level] [-x int] [-y int]\n", progname); fprintf (fd, " -e: edit file (%s)\n", (file) ? file : "none"); fprintf (fd, " -h: help message\n"); fprintf (fd, " -p: play file (%s)\n", (file) ? file : "none"); + fprintf (fd, " -s: speed Ä­n tens/sec (%d)\n", speed); fprintf (fd, " -v: verbose level (%d)\n", verbose); + fprintf (fd, " -x: board height (%d)\n", x); + fprintf (fd, " -y: board width (%d)\n", y); fprintf (fd, "%s version %s\n", progname, version); return ret; @@ -99,6 +103,14 @@ int main (int argc, char *argv[]) mode = 'p'; file = arg; break; + case 's': + arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; + if (arg == NULL) { + VERBOSE (ERROR, fprintf (stderr, "%s: no speed specified\n", progname)); + return usage (1); + } + speed = atoi (arg); + break; case 'v': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; if (arg == NULL) { @@ -133,6 +145,10 @@ int main (int argc, char *argv[]) VERBOSE (ERROR, fprintf (stderr, "no mode defined\n")); return 1; } + if ((speed < 1) || (speed > 255)) { + VERBOSE (ERROR, fprintf (stderr, "incorrect speed (%d)\n", speed)); + return 1; + } /* init curses window */ initscr (); @@ -168,6 +184,9 @@ int main (int argc, char *argv[]) } xelement = (xsize - element->xsize) / 2; yelement = (ysize - element->ysize) / 2; + } else { /* mono cell */ + element = initboard (1, 1); + element->tab[0] = 'X'; } /* window positions */ @@ -187,7 +206,7 @@ int main (int argc, char *argv[]) char *ptr = NULL; boardwindow (board, xboard, yboard, 1); - if (element) { + if ((element) && (mode == 'e')) { rotateelement (element, rotate); mirrorelement (element, mirror); elementwindow (board, xboard, yboard, element, xelement, yelement); @@ -195,68 +214,89 @@ int main (int argc, char *argv[]) rotate = 0; mirror = 0; - switch (getch ()) { - case ' ': - case '\n': - case '\r': - computenextgen (board); - break; - case 'c': - if (element) { - putelement (board, element, xelement, yelement, 1); - } - break; - case 'd': - mirror = -1; - break; + int ch = getch (); + switch (mode) { case 'e': - rotate = -1; - break; - case 'f': - mirror = 1; - break; - case KEY_UP: - case 'i': - yelement = (yelement + board->ysize - 1) % board->ysize; - break; - case KEY_LEFT: - case 'j': - xelement = (xelement + board->xsize - 1) % board->xsize; - break; - case KEY_DOWN: - case 'k': - yelement = (yelement + 1) % board->ysize; - break; - case KEY_RIGHT: - case 'l': - xelement = (xelement + 1) % board->xsize; - break; - case KEY_ESC: - case 'q': - stop = 1; - break; - case 'r': - rotate = 1; - break; - case 's': - ptr = saveboard (board, "Board"); - if (writedata ("board.gol", ptr)) { - VERBOSE (WARNING, printf ("issue writing Board\n")); + switch (ch) { + case ' ': + case '\n': + case '\r': + mode = 'p'; + halfdelay (5); + break; + case 'c': + if (element) { + putelement (board, element, xelement, yelement, 1); + } + break; + case 'd': + mirror = -1; + break; + case 'e': + rotate = -1; + break; + case 'f': + mirror = 1; + break; + case KEY_UP: + case 'i': + yelement = (yelement + board->ysize - 1) % board->ysize; + break; + case KEY_LEFT: + case 'j': + xelement = (xelement + board->xsize - 1) % board->xsize; + break; + case KEY_DOWN: + case 'k': + yelement = (yelement + 1) % board->ysize; + break; + case KEY_RIGHT: + case 'l': + xelement = (xelement + 1) % board->xsize; + break; + case KEY_ESC: + case 'q': + stop = 1; + break; + case 'r': + rotate = 1; + break; + case 's': + ptr = saveboard (board, "Board"); + if (writedata ("board.gol", ptr)) { + VERBOSE (WARNING, printf ("issue writing Board\n")); + } + free (ptr); + break; + case KEY_BACKSPACE: + case KEY_DELETE: + case 127: + case '\b': + case 'x': + if (element) { + putelement (board, element, xelement, yelement, 0); + } + break; + //case ERR: + //default: } - free (ptr); break; - case KEY_BACKSPACE: - case KEY_DELETE: - case 127: - case '\b': - case 'x': - if (element) { - putelement (board, element, xelement, yelement, 0); + case 'p': + switch (ch) { + case ' ': + case '\n': + case '\r': + mode = 'e'; + halfdelay (0); + break; + case 'q': + stop = 1; + break; + case ERR: + default: + computenextgen (board); } break; - break; - //case ERR: - //default: } }