From: Laurent MAZET Date: Mon, 9 Sep 2024 15:30:16 +0000 (+0200) Subject: add a wide board mode X-Git-Tag: v1.0~3 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=cf79a7d2d24de2ba861af1b531802a261e66a5e9;p=snake.git add a wide board mode --- diff --git a/display.c b/display.c index 2e6bd34..cd6b2f6 100644 --- 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); } diff --git a/function.c b/function.c index 4894f2f..90aa293 100644 --- a/function.c +++ b/function.c @@ -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 5e8aa3e..db85520 100644 --- 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 = " 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

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 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) {