add score and duration
authorLaurent Mazet <mazet@softndesign.org>
Thu, 29 Aug 2024 20:47:34 +0000 (22:47 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Thu, 29 Aug 2024 20:47:34 +0000 (22:47 +0200)
display.c
display.h
function.c
snake.c

index a846579799a8d048b689ac0ef7214afb6df35e71..a71d43b7e1d48ab99da2009651bac3ae3f04e58f 100644 (file)
--- 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: */
index b8cf627c7cbc24cc6d4b58bee8422767ae1cd9f0..63f2a354b8cd3da0f082f283e910e8ada9d0e02a 100644 (file)
--- 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: */
index 908a00e4be76da269bdddabc139d60c0417c9c30..db07934a3d2595eebca0ad6168fb2d926d76c6b0 100644 (file)
@@ -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 bdcb61ccc036a1672ef9a8d059109a832382c375..dcdf03811345ca0f1d2ad594c8fa0307b9ab320f 100644 (file)
--- a/snake.c
+++ b/snake.c
@@ -8,6 +8,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#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);