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));
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);
int length = 0;
int score = 0;
char *tab = NULL;
+ int turnspan = 0;
int width = 0;
char *xsnake = NULL;
char *ysnake = NULL;
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) {
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++) {
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;
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) {
duration = data->duration;
score = data->score;
snake = data->snake;
+ turnspan = data->turnspan;
free (data);
}
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:
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;
}
}
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 */
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:
case 'p':
if (mode == 0) {
mode = 1;
- setendtime (&turn, tic);
+ tic (&turn);
} else if (mode == 1) {
mode = 0;
}
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"));
free (savename);
freedata (data);
}
+ if (mode == 1) {
+ tic (&turn);
+ }
break;
}
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)
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);
int direction;
int duration;
int score;
+ int turnspan;
snake_t *snake;
} data_t;