optimal time mnanagement
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 4 Sep 2024 13:30:31 +0000 (15:30 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 4 Sep 2024 13:30:31 +0000 (15:30 +0200)
function.c
snake.c
time.c
time.h
type.h

index a3e0c3706f942f13168432b4bd94ca675d161161..4894f2f161ac26891ef7f520c94d0ac91ad602fc 100644 (file)
@@ -134,7 +134,7 @@ int _sprinttab (char *buffer, char *name, int *tab, int nb)
 
 char *saveboard (data_t *data)
 {
-    int size = 5 * (7 + 3 + 3);
+    int size = 6 * (7 + 3 + 3) + 1 + 6;
     size += 5 + 5 + data->board->width * data->board->height + 1;
     size += 2 * (5 + 5 + data->snake->length + 1);
     VERBOSE (INFO, size += data->board->height * (8 + data->board->width));
@@ -148,6 +148,7 @@ char *saveboard (data_t *data)
     l += sprintf (buffer + l, "length: %d\n", data->snake->length);
     l += sprintf (buffer + l, "score: %d\n", data->score);
     l += sprintf (buffer + l, "tab: \"%s\"\n", data->board->tab);
+    l += sprintf (buffer + l, "turnspan: %d\n", data->turnspan);
     l += sprintf (buffer + l, "width: %d\n", data->board->width);
     l += _sprinttab (buffer + l, "xsnake", data->snake->x, data->snake->length);
     l += _sprinttab (buffer + l, "ysnake", data->snake->y, data->snake->length);
@@ -220,6 +221,7 @@ data_t *loaddata (char *str)
     int length = 0;
     int score = 0;
     char *tab = NULL;
+    int turnspan = 0;
     int width = 0;
     char *xsnake = NULL;
     char *ysnake = NULL;
@@ -248,6 +250,8 @@ data_t *loaddata (char *str)
             score = atoi (value);
         } else if (strcmp (keyword,  "tab") == 0) {
             tab = atos (value);
+        } else if (strcmp (keyword,  "turnspan") == 0) {
+            turnspan = atoi (value);
         } else if (strcmp (keyword,  "width") == 0) {
             width = atoi (value);
         } else if (strcmp (keyword,  "xsnake") == 0) {
@@ -272,6 +276,7 @@ data_t *loaddata (char *str)
         data = initdata (width, height);
         data->duration = duration;
         data->score = score;
+        data->turnspan = turnspan;
         data->snake->dir = direction;
         data->snake->length = length;
         for (i = 0; i < length; i++) {
diff --git a/snake.c b/snake.c
index 99b5331063d0c7714c86e1b7a4b5c2d0b461f8f5..b1a2ac3591c2fadb9f5c8f34f5e86d407a24b92e 100644 (file)
--- a/snake.c
+++ b/snake.c
@@ -22,10 +22,11 @@ char *version = "0.1";
 char *filename = NULL;
 int scale = 1;
 int seed = 0;
-int tic = 80;
-int maxspeed = 8;
-int speed = 8;
-int turnlimit = 100;
+int turnspanmin = 50;
+int turnspan = 1000;
+int turnspanmax = 1000;
+int spangap = 50;
+int nbturnsperdraw = 15;
 int malus = 10;
 int bonus = 5;
 
@@ -114,11 +115,13 @@ int main (int argc, char *argv[])
     seed = newseed (seed);
 
     /* init game */
-    int score = 0;
     int duration = 0;
-    int whelp = strmaxlen (help, '\n');
+    int turnspan = turnspanmax;
+    int score = 0;
     board_t *board = NULL;
     snake_t *snake = NULL;
+
+    int whelp = strmaxlen (help, '\n');
     if (filename) {
         char *buffer = readdata (filename);
         if (buffer == NULL) {
@@ -136,6 +139,7 @@ int main (int argc, char *argv[])
         duration = data->duration;
         score = data->score;
         snake = data->snake;
+        turnspan = data->turnspan;
         free (data);
     }
 
@@ -185,14 +189,17 @@ int main (int argc, char *argv[])
     int stop = 0;
     int mode = 0;
     timeval_t turn = {0, 0};
+    int delta = 0;
+    int nbturns = 0;
     while (!stop) {
 
         if (mode == 1) {
-            if (isovertime (&turn)) {
-                setendtime (&turn, tic);
-                duration++;
-            }
-            if ((duration) && (duration % speed == 0)) {
+            delta += toc (&turn);
+            tic (&turn);
+            if (delta > turnspan) {
+                delta -= turnspan;
+                duration += turnspan;
+                nbturns++;
                 int ret = movesnake (board, snake, snake->dir);
                 switch (ret) {
                 case -1:
@@ -201,17 +208,22 @@ int main (int argc, char *argv[])
                 case 1:
                     score++;
                     nonewpoint = 0;
-                    speed = (speed < maxspeed) ? speed + 1 : speed;
+                    if (turnspan < turnspanmax) {
+                        turnspan += spangap;
+                    }
                     break;
                 }
 
             }
-            if ((duration) && (duration % turnlimit == 0)) {
+            if (nbturns == nbturnsperdraw) {
                 drawbonus (board, snake, malus, bonus);
                 if (nonewpoint) {
-                    speed = (speed > 1) ? speed - 1 : speed;
+                    if (turnspan > turnspanmin) {
+                        turnspan -= spangap;
+                    }
                 }
                 nonewpoint = 1;
+                nbturns = 0;
             }
         }
 
@@ -229,7 +241,7 @@ int main (int argc, char *argv[])
             setcolor (red_black);
             break;
         }
-        scorewindow (xscore, yscore, whelp - 2, score, (duration * tic) / 1000);
+        scorewindow (xscore, yscore, whelp - 2, score, duration / 1000);
         setcolor (gray_black);
 
         /* message */
@@ -239,7 +251,7 @@ int main (int argc, char *argv[])
             msgwindow ("Press <p> to start", xmsg, ymsg, lmsg);
             break;
         case 1:
-            sprintf (msg, "Speed %d", maxspeed - speed + 1);
+            sprintf (msg, "Speed %d", (turnspanmax - turnspan) / spangap + 1);
             msgwindow (msg, xmsg, ymsg, lmsg);
             break;
         case 2:
@@ -255,7 +267,7 @@ int main (int argc, char *argv[])
         case 'p':
             if (mode == 0) {
                 mode = 1;
-                setendtime (&turn, tic);
+                tic (&turn);
             } else if (mode == 1) {
                 mode = 0;
             }
@@ -269,6 +281,7 @@ int main (int argc, char *argv[])
                 data_t *data = createdata (board, snake);
                 data->duration = duration;
                 data->score = score;
+                data->turnspan = turnspan;
                 char *ptr = saveboard (data);
                 if (writedata (savename, ptr)) {
                     VERBOSE (WARNING, printf ("issue writing Board\n"));
@@ -277,6 +290,9 @@ int main (int argc, char *argv[])
                 free (savename);
                 freedata (data);
             }
+            if (mode == 1) {
+                tic (&turn);
+            }
             break;
         }
 
diff --git a/time.c b/time.c
index 7760d331a22ca346035ee53d25527f105a3c6339..2ccb9f6e6dd9aa535c852b6a44e0a8e37b3fc15a 100644 (file)
--- a/time.c
+++ b/time.c
@@ -16,21 +16,25 @@ int newseed (int seed)
     return seed;
 }
 
-void setendtime (timeval_t *t, int s)
+void tic (timeval_t *t)
 {
     gettimeofday (t, NULL);
-    t->tv_usec += s * 1000l;
-    t->tv_sec += t->tv_usec / 1000000l;
-    t->tv_usec = t->tv_usec % 1000000l;
 }
 
-int isovertime (timeval_t *t)
+int toc (timeval_t *t0)
 {
-    struct timeval _c;
-    struct timeval *c = &_c;
-    gettimeofday (c, NULL);
-    VERBOSE (INFO, FILE *log = fopen ("snake.log", "a"); long msec = (c->tv_usec - t->tv_usec) / 1000; if (c->tv_sec != t->tv_sec) msec += 1000; fprintf (log, "diff: %ld\n", msec); fclose (log));
-    return ((t->tv_sec < c->tv_sec) || ((t->tv_sec == c->tv_sec) && ( t->tv_usec < c->tv_usec)));
+    timeval_t _t = {0, 0};
+    timeval_t *t = &_t;
+
+    gettimeofday (t, NULL);
+
+    int delta = 0;
+    if (t0->tv_sec != 0) {
+        delta += (t->tv_sec - t0->tv_sec) * 1000;
+        delta += (t->tv_usec - t0->tv_usec) / 1000;
+        //assert (delta > 0);
+    }
+    return delta;
 }
 
 void msleep (int msec)
diff --git a/time.h b/time.h
index e032e5cc3baa00af8d9d4b436f1285689e93a00a..d991595fafab60c81b0541d771ee4a9142e6d601 100644 (file)
--- a/time.h
+++ b/time.h
@@ -7,9 +7,9 @@ typedef struct timeval timeval_t;
 
 int newseed (int seed);
 
-void setendtime (timeval_t *t, int s);
+void tic (timeval_t *t);
 
-int isovertime (timeval_t *t);
+int toc (timeval_t *t0);
 
 void msleep (int msec);
 
diff --git a/type.h b/type.h
index 3c84e74b13e2557893201367c8139f1f0a831088..25438ce6ba35211856c17a2b9ca24c29e9cf6cc8 100644 (file)
--- a/type.h
+++ b/type.h
@@ -32,6 +32,7 @@ typedef struct {
     int direction;
     int duration;
     int score;
+    int turnspan;
     snake_t *snake;
 } data_t;