}
}
+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: */
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: */
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];
}
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) {
snake->y[i + 1] = snake->y[i];
}
snake->length++;
+ ret = 1;
break;
}
*cell = ' ';
snake->y[0] = y;
snake->dir = dir;
-
- ret = 1;
}
return ret;
#include <stdio.h>
#include <stdlib.h>
+#include "color.h"
#include "constant.h"
#include "debug.h"
#include "display.h"
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);
/* 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);
/* 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);