From c8e83d74a51c5780277c9befed28dc4df215dbb1 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Wed, 4 Sep 2024 15:30:31 +0200 Subject: [PATCH] optimal time mnanagement --- function.c | 7 ++++++- snake.c | 50 +++++++++++++++++++++++++++++++++----------------- time.c | 24 ++++++++++++++---------- time.h | 4 ++-- type.h | 1 + 5 files changed, 56 insertions(+), 30 deletions(-) diff --git a/function.c b/function.c index a3e0c37..4894f2f 100644 --- a/function.c +++ b/function.c @@ -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 99b5331..b1a2ac3 100644 --- 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

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 7760d33..2ccb9f6 100644 --- 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 e032e5c..d991595 100644 --- 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 3c84e74..25438ce 100644 --- 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; -- 2.30.2