add a wide board mode
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 9 Sep 2024 15:30:16 +0000 (17:30 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 9 Sep 2024 15:30:16 +0000 (17:30 +0200)
display.c
function.c
snake.c

index 2e6bd34becc2c3ffd38f7ecc7fb1fc395cd0d992..cd6b2f6c3c04c430cc0cce4c05653c444808ad6c 100644 (file)
--- a/display.c
+++ b/display.c
@@ -245,7 +245,6 @@ void msg2window (char *msg, int xoffset, int yoffset)
 {
     int length = strlen (msg) + 2;
     xoffset -= length / 2;
-    yoffset -= strmaxlen (msg, '\n') / 2;
     msgwindow (msg, xoffset, yoffset, length);
 }
 
index 4894f2f161ac26891ef7f520c94d0ac91ad602fc..90aa293fa54c4389475664d8b051a737e4d57c88 100644 (file)
@@ -19,7 +19,7 @@ int strmaxlen (char *str, char ch)
         }
         str = end + 1;
     }
-    return len;
+    return len ? len : (int)strlen (str);
 }
 
 board_t *initboard (int width, int height)
diff --git a/snake.c b/snake.c
index 5e8aa3ee003e6916b6355b59839f76dbf7879096..db85520824e35ec57c0aff7c75873dd18b3a7ac9 100644 (file)
--- a/snake.c
+++ b/snake.c
@@ -29,6 +29,7 @@ int spangap = 50;
 int nbturnsperdraw = 15;
 int malus = 10;
 int bonus = 5;
+int wide = 0;
 
 char *help =
     "<i> Move up cursor\n"
@@ -48,6 +49,7 @@ int usage (int ret)
     fprintf (fd, " -h: help message\n");
     fprintf (fd, " -s: scale [0..3] (%d)\n", scale);
     fprintf (fd, " -v: verbose level [%d..%d] (%d)\n", ERROR, DEBUG, verbose);
+    fprintf (fd, " -w: wide board (%d)\n", wide);
     fprintf (fd, "%s version %s\n", progname, version);
 
     return ret;
@@ -99,6 +101,9 @@ int main (int argc, char *argv[])
             }
             verbose = atoi (arg);
             break;
+        case 'w':
+            wide = 1;
+            break;
         case 'h':
         default:
             return usage (c != 'h');
@@ -155,8 +160,8 @@ int main (int argc, char *argv[])
 
     /* load playground */
     if (!filename) {
-        int w0board = COLS - whelp - 2 * (xoffset + 1);
-        int h0board = LINES - 2 * (yoffset + 1);
+        int w0board = COLS - (wide ? 0 : whelp) - 2 * (xoffset + 1);
+        int h0board = LINES - (wide ? 2 : 0) - 2 * (yoffset + 1);
         board = initboard (w0board, h0board);
         applyscale (board, scale);
         snake = initsnake (board);
@@ -165,12 +170,12 @@ int main (int argc, char *argv[])
 
     /* window positions */
     int xboard = board->xoffset = xoffset + 1;
-    int yboard = board->yoffset = yoffset + 1;
-    int xscore = xboard + xoffset + 2 + board->xsize;
-    int yscore = yboard;
-    int wscore = whelp - 2;
-    int xhelp = xscore - 1;
-    int yhelp = yscore + 2 + xoffset;
+    int yboard = board->yoffset = yoffset + 1 + (wide ? 1 : 0);
+    int xscore = xboard + 2 + (wide ? -1 : xoffset + board->xsize);
+    int yscore = yboard - (wide ? 2 : 0);
+    int wscore = (wide ? 15 : whelp - 2);
+    int xhelp = (wide ? xboard + (board->xsize - 1) / 2 : xscore - 1);
+    int yhelp = (wide ? yboard + (board->ysize - 1) / 2 : yscore + 2 + xoffset);
     int xsave = max (xboard + (board->xsize - savelen) / 2, 1);
     int ysave = yboard + (board->ysize - 1) / 2;
     char *savename = NULL;
@@ -178,12 +183,15 @@ int main (int argc, char *argv[])
     VERBOSE (DEBUG, printf ("width: %d\nheight: %d\n", board->width, board->height));
 
     /* help window */
-    int lhelp = helpwindow (help, xhelp, yhelp);
+    int lhelp = 0;
+    if (!wide) {
+        lhelp = helpwindow (help, xhelp, yhelp);
+    }
 
     /* window positions (msg) */
-    int xmsg = xhelp + 1;
-    int ymsg = yhelp + lhelp + 1 + xoffset;
-    int lmsg = whelp - 2;
+    int lmsg = (wide ? 20 : whelp - 2);
+    int xmsg = (wide ? xboard + board->xsize - lmsg - 1 : xhelp + 1);
+    int ymsg = (wide ? yboard + board->ysize + 1 : yhelp + lhelp + 1 + xoffset);
 
     /* main loop */
     int nonewpoint = 1;
@@ -228,9 +236,6 @@ int main (int argc, char *argv[])
             }
         }
 
-        boardwindow (board, 0);
-        displaysnake (board, snake);
-
         switch (mode) {
         case 0:
             setcolor (gray_black);
@@ -250,22 +255,38 @@ int main (int argc, char *argv[])
         switch (mode) {
         case 0:
             msgwindow ("Press <p> to start", xmsg, ymsg, lmsg);
-            msg2window ("Game passed", xboard + board->xsize / 2, yboard + (board->ysize - 1) / 2);
+            sprintf (msg, "%s", "Game paused");
             break;
         case 1:
             sprintf (msg, "Speed %d", (turnspanmax - turnspan) / spangap + 1);
             msgwindow (msg, xmsg, ymsg, lmsg);
+            *msg = 0;
             break;
         case 2:
             msgwindow ("Press <q> to quit", xmsg, ymsg, lmsg);
-            msg2window ("End of game", xboard + board->xsize / 2, yboard + (board->ysize - 1) / 2);
+            sprintf (msg, "%s", "End of game");
             break;
         }
 
+        boardwindow (board, 0);
+        displaysnake (board, snake);
+        if (*msg) {
+            msg2window (msg, xboard + board->xsize / 2, yboard + (board->ysize - 1) / 2);
+        }
+
         int ch = getch ();
 
         /* main controls */
         switch (ch) {
+        case 'h':
+            if (wide) {
+                helpwindow (help, xboard + (board->xsize - strmaxlen (help, '\n')) / 2, yboard + 1);
+                while (getch () == ERR) {
+                    msleep (200);
+                }
+                tic (&turn);
+            }
+            break;
         case ' ':
         case 'p':
             if (mode == 0) {