play mode fonctional
authorLaurent Mazet <mazet@softndesign.org>
Sun, 23 Jun 2024 21:17:27 +0000 (23:17 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Sun, 23 Jun 2024 21:17:27 +0000 (23:17 +0200)
gameoflife.c

index 9bc3cfaa19b263dc9b1d76e4cdfc670c8e72b6c7..b40cee6e48994bb453adfdb3c222a3d75ae77505 100644 (file)
@@ -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"
     "<c> Put cells\n"
     "<d> Mirror up/down\n"
     "<e> 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:
         }
     }