From: Laurent Mazet Date: Thu, 29 Aug 2024 20:47:34 +0000 (+0200) Subject: add score and duration X-Git-Tag: v1.0~19 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=eec4cb8767cb584bc77ddeec794faf872c030a4d;p=snake.git add score and duration --- diff --git a/display.c b/display.c index a846579..a71d43b 100644 --- a/display.c +++ b/display.c @@ -249,4 +249,16 @@ void displaysnake (board_t *board, snake_t *snake) } } +void scorewindow (int xoffset, int yoffset, int length, int score, int duration) +{ + _dobound (length, 1, xoffset, yoffset); + + char msg[128] = {0}; + int sec = duration % 60; + int min = (duration / 60) % 60; + int hour = duration / 3600; + sprintf (msg, "% 4d / %02d:%02d:%02d", score, hour, min, sec); + mvaddstr (yoffset, xoffset + (length - 15) / 2, msg); +} + /* vim: set ts=4 sw=4 et: */ diff --git a/display.h b/display.h index b8cf627..63f2a35 100644 --- a/display.h +++ b/display.h @@ -36,6 +36,8 @@ void msgwindow (char *msg, int xoffset, int yoffset, int length); void displaysnake (board_t *board, snake_t *snake); +void scorewindow (int xoffset, int yoffset, int length, int score, int duration); + #endif /* __DISPLAY_H__ */ /* vim: set ts=4 sw=4 et: */ diff --git a/function.c b/function.c index 908a00e..db07934 100644 --- a/function.c +++ b/function.c @@ -251,10 +251,23 @@ void freesnake (snake_t *snake) free (snake); } +int isown (snake_t *snake, int x, int y) +{ + int ret = 0; + int i; + for (i = 0; i < snake->length; i++) { + if ((snake->x[i] == x) && (snake->y[i] == y)) { + ret = 1; + break; + } + } + return ret; +} + int movesnake (board_t *board, snake_t *snake, int dir) { int i; - int ret = 0; + int ret = -1; int x = snake->x[0]; int y = snake->y[0]; @@ -275,7 +288,9 @@ int movesnake (board_t *board, snake_t *snake, int dir) } if ((x >= 0) && (x < board->width) && - (y >= 0) && (y < board->height)) { + (y >= 0) && (y < board->height) && + (!isown (snake, x, y))) { + ret = 0; char *cell = getcell (board, x, y); switch (*cell) { @@ -298,6 +313,7 @@ int movesnake (board_t *board, snake_t *snake, int dir) snake->y[i + 1] = snake->y[i]; } snake->length++; + ret = 1; break; } *cell = ' '; @@ -306,8 +322,6 @@ int movesnake (board_t *board, snake_t *snake, int dir) snake->y[0] = y; snake->dir = dir; - - ret = 1; } return ret; diff --git a/snake.c b/snake.c index bdcb61c..dcdf038 100644 --- a/snake.c +++ b/snake.c @@ -8,6 +8,7 @@ #include #include +#include "color.h" #include "constant.h" #include "debug.h" #include "display.h" @@ -121,7 +122,8 @@ int main (int argc, char *argv[]) halfdelay (1); /* load playground */ - int w0board = COLS - strmaxlen (help, '\n') - 2 * (xoffset + 1); + int whelp = strmaxlen (help, '\n'); + int w0board = COLS - whelp - 2 * (xoffset + 1); int h0board = LINES - 2 * (yoffset + 1); board_t *board = initboard (w0board, h0board); applyscale (board, scale); @@ -130,8 +132,8 @@ int main (int argc, char *argv[]) /* window positions */ int xboard = board->xoffset = xoffset + 1; int yboard = board->yoffset = yoffset + 1; - int xscore = xboard + xoffset + 1 + board->xsize; - int yscore = yboard - 1; + int xscore = xboard + xoffset + 2 + board->xsize; + int yscore = yboard; int xhelp = xscore; int yhelp = yscore + 3 + xoffset; int xsave = max (xboard + (board->xsize - savelen) / 2, 1); @@ -149,21 +151,47 @@ int main (int argc, char *argv[]) /* main loop */ int stop = 0; int mode = 0; + int score = 0; + int duration = 0; timeval_t turn = {0, 0}; - timeval_t renew = {0, 0}; + int nbturns = 0; while (!stop) { boardwindow (board, 0); + + switch (mode) { + case 0: + setcolor (gray_black); + break; + case 1: + setcolor (yellow_black); + break; + case 2: + setcolor (red_black); + break; + } + scorewindow (xscore, yscore, whelp - 2, score, (duration * speed) / 1000); + setcolor (gray_black); + if (mode == 1) { if (isovertime (&turn)) { setendtime (&turn, speed); - if (!movesnake (board, snake, snake->dir)) { + nbturns++; + duration++; + int ret = movesnake (board, snake, snake->dir); + switch (ret) { + case -1: mode = 2; + break; + case 1: + score++; + break; } + } - if (isovertime (&renew)) { + if (nbturns == ratio) { drawbonus (board, malus, bonus); - setendtime (&renew, ratio * speed); + nbturns = 0; } } displaysnake (board, snake);