From 90cc6765d8a2956f76d80f65c3494c9d7d813193 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Mon, 22 Jul 2024 13:35:51 +0200 Subject: [PATCH] first block on board --- display.c | 199 ++++++++++------------------------------------------- display.h | 2 + function.c | 36 +++++----- function.h | 4 +- tetris.c | 22 +++++- 5 files changed, 77 insertions(+), 186 deletions(-) diff --git a/display.c b/display.c index 467787c..12fd83b 100644 --- a/display.c +++ b/display.c @@ -122,205 +122,66 @@ void _set_symb_color (char symb) { switch (symb) { case ' ': - set_color (black); - break; - case '.': set_color (white); break; - case '/': - set_color (byellow); - break; - case '0': - case '6': - set_color (wgreen); - break; case '1': - case '7': - set_color (wred); + set_color (black); break; case '2': - case '8': - set_color (green); + set_color (wred); break; case '3': - case '9': - set_color (red); + set_color (wgreen); break; case '4': - case ':': - set_color (bgreen); + set_color (wblue); break; case '5': - case ';': - set_color (bred); + set_color (wcyan); break; - case 'S': - set_color (byellow); + case '6': + set_color (wmagenta); break; - case 'Z': - set_color (bblue); + case '7': + set_color (wyellow); break; } } void _element0 (board_t *board, int x, int y, int symb) { - int element = ' '; - switch (symb) { - case '/': - element = 'X'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - element = '0'; - break; - case '6': - case '7': - case '8': - case '9': - case ':': - case ';': - element = ACS_DIAMOND; - break; - } _set_symb_color (symb); - mvaddch (board->yoffset + y, board->xoffset + x, element); + mvaddch (board->yoffset + y, board->xoffset + x, ' '); set_color (white); } void _element1 (board_t *board, int x, int y, int symb) { - int element0 = ' '; - int element1 = ' '; - switch (symb) { - case '/': - element0 = '>'; - element1 = '<'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - element0 = '['; - element1 = ']'; - break; - case '6': - case '7': - case '8': - case '9': - case ':': - case ';': - element0 = '<'; - element1 = '>'; - break; - } _set_symb_color (symb); - mvaddch (board->yoffset + y, board->xoffset + 2 * x, element0); - mvaddch (board->yoffset + y, board->xoffset + 2 * x + 1, element1); + mvaddch (board->yoffset + y, board->xoffset + 2 * x, ' '); + mvaddch (board->yoffset + y, board->xoffset + 2 * x + 1, ' '); set_color (white); } void _element2 (board_t *board, int x, int y, int symb) { - int element00 = ' '; - int element10 = ' '; - int element01 = ' '; - int element11 = ' '; - switch (symb) { - case '/': - element00 = '\\'; - element01 = '/'; - element10 = '/'; - element11 = '\\'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - element00 = ACS_ULCORNER; - element01 = ACS_URCORNER; - element10 = ACS_LLCORNER; - element11 = ACS_LRCORNER; - break; - case '6': - case '7': - case '8': - case '9': - case ':': - case ';': - element00 = '/'; - element01 = '\\'; - element10 = '\\'; - element11 = '/'; - break; - } _set_symb_color (symb); - mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x, element00); - mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x + 1, element01); - mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 2 * x, element10); - mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 2 * x + 1, element11); + mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x, ' '); + mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x + 1, ' '); + mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 2 * x, ' '); + mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 2 * x + 1, ' '); set_color (white); } void _element3 (board_t *board, int x, int y, int symb) { - int element00 = ' '; - int element10 = ' '; - int element01 = ' '; - int element11 = ' '; - int element02 = ' '; - int element12 = ' '; - switch (symb) { - case '/': - element00 = '\\'; - element01 = '|'; - element02 = '/'; - element10 = '/'; - element11 = '|'; - element12 = '\\'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - element00 = ACS_ULCORNER; - element01 = ACS_HLINE; - element02 = ACS_URCORNER; - element10 = ACS_LLCORNER; - element11 = ACS_HLINE; - element12 = ACS_LRCORNER; - break; - case '6': - case '7': - case '8': - case '9': - case ':': - case ';': - element00 = '/'; - element01 = 'T'; - element02 = '\\'; - element10 = '\\'; - element11 = '_'; - element12 = '/'; - break; - } _set_symb_color (symb); - mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x, element00); - mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x + 1, element01); - mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x + 2, element02); - mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x, element10); - mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 1, element11); - mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 2, element12); + mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x, ' '); + mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x + 1, ' '); + mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x + 2, ' '); + mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x, ' '); + mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 1, ' '); + mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 2, ' '); set_color (white); } @@ -350,9 +211,21 @@ void boardwindow (board_t *board) _dobound (board->xsize, board->ysize, board->xoffset, board->yoffset); set_color (white); - for (i = 0; i < board->width; i++) { + for (i = 0; i < board->width; i++) { for (j = 0; j < board->height; j++) { - _element (board, i, j, getvalue (board, i, j)); + _element (board, i, j, *getcell (board, i, j)); + } + } +} + +void displayblock (board_t *board, block_t *block, int x, int y) +{ + int i, j; + for (i = 0; i < block->width; i++) { + for (j = 0; j < block->height; j++) { + if (*getcell (block, i, j) != ' ') { + _element (board, x + i, y + j, '0' + block->color); + } } } } diff --git a/display.h b/display.h index df04aa7..d04169d 100644 --- a/display.h +++ b/display.h @@ -10,6 +10,8 @@ int helpwindow (char *msg, int xoffset, int yoffset); void boardwindow (board_t *board); +void displayblock (board_t *board, block_t *block, int x, int y); + char *savewindow (int length, int xoffset, int yoffset); void msgwindow (char *msg, int xoffset, int yoffset, int length); diff --git a/function.c b/function.c index 154833d..ea76a93 100644 --- a/function.c +++ b/function.c @@ -261,48 +261,48 @@ void freeblock (block_t *block) free (block); } -block_t *rotateelement (block_t *element, int rot) +block_t *rotateblock (block_t *block, int rot) { int i, j; rot = (rot > 0) ? rot % 4 : ((1 - rot / 4) * 4 + rot) % 4; - block_t *newelement = NULL; + block_t *newblock = NULL; switch (rot) { case 0: - newelement = copyblock (element); + newblock = copyblock (block); break; case 1: - newelement = initblock (element->height, element->width); - for (i = 0; i < element->width; i++) { - for (j = 0; j < element->height; j++) { - *getcell (newelement, element->height - 1 - j, i) = *getcell (element, i, j); + newblock = initblock (block->height, block->width); + for (i = 0; i < block->width; i++) { + for (j = 0; j < block->height; j++) { + *getcell (newblock, block->height - 1 - j, i) = *getcell (block, i, j); } } break; case 2: - newelement = initblock (element->width, element->height); - for (i = 0; i < element->width; i++) { - for (j = 0; j < element->height; j++) { - *getcell (newelement, element->width - 1 - i, element->height - 1 - j) = *getcell (element, i, j); + newblock = initblock (block->width, block->height); + for (i = 0; i < block->width; i++) { + for (j = 0; j < block->height; j++) { + *getcell (newblock, block->width - 1 - i, block->height - 1 - j) = *getcell (block, i, j); } } break; case 3: - newelement = initblock (element->height, element->width); - for (i = 0; i < element->width; i++) { - for (j = 0; j < element->height; j++) { - *getcell (newelement, j, element->width - 1 - i) = *getcell (element, i, j); + newblock = initblock (block->height, block->width); + for (i = 0; i < block->width; i++) { + for (j = 0; j < block->height; j++) { + *getcell (newblock, j, block->width - 1 - i) = *getcell (block, i, j); } } break; } - changeblock (element, newelement); - freeblock (newelement); + changeblock (block, newblock); + freeblock (newblock); - return element; + return block; } /* vim: set ts=4 sw=4 et: */ diff --git a/function.h b/function.h index 883808e..e7a5340 100644 --- a/function.h +++ b/function.h @@ -39,7 +39,7 @@ board_t *loadboard (char *str); #define getcell(b, x, y) ({ __typeof__ (b) _b = (b); int _x = (x), _y = (y);_b->tab + _x + _b->width * _y; }) -#define getvalue(b, x, y) ({ __typeof__ (b) _b = (b); int _x = (x), _y = (y); (_x >= 0) && (_x < _b->width) && (_y >= 0) && (_y < _b->height) ? *getcell (_b, _x, _y) : 0; }) +#define getvalue(b, x, y) ({ __typeof__ (b) _b = (b); int _x = (x), _y = (y); (_x >= 0) && (_x < _b->width) && (_y >= 0) && (_y < _b->height) ? *(getcell (_b, _x, _y)) : 0; }) block_t *initblock (int xsize, int ysize); @@ -49,7 +49,7 @@ block_t *copyblock (block_t *block); void freeblock (block_t *block); -block_t *rotateelement (block_t *element, int rot); +block_t *rotateblock (block_t *block, int rot); #endif /* __FUNCTION_H__ */ diff --git a/tetris.c b/tetris.c index da41f71..a1e331c 100644 --- a/tetris.c +++ b/tetris.c @@ -132,9 +132,13 @@ int main (int argc, char *argv[]) /* get blocks */ int nb_blocks = 0; - block_t *block_t = getblocks ("std", &nb_blocks); + block_t *blocks = getblocks ("std", &nb_blocks); int current = rand () % nb_blocks; + block_t *cblock = copyblock (blocks + current); + int xblock = (board->width - cblock->width) / 2; + int yblock = 0; int next = rand () % nb_blocks; + VERBOSE (DEBUG, fprintf (stderr, "%d/%d: (%d, %d)\n", current, nb_blocks, xblock, yblock)); /* init curses window */ initscr (); @@ -167,7 +171,7 @@ int main (int argc, char *argv[]) /* event loop */ int mode = 0; int speed = 255; - + int rot = 0; int stop = 0; while (!stop) { @@ -176,11 +180,21 @@ int main (int argc, char *argv[]) char msg[128] = {0}; switch (mode) { case 0: +freeblock (cblock); +current = next; +cblock = copyblock (blocks + current); +xblock = (board->width - cblock->width) / 2; +yblock = 0; +next = rand () % nb_blocks; +sprintf (msg, "%d/%d: (%d, %d)\n", current, nb_blocks, xblock, yblock); halfdelay (0); - sprintf (msg, "Get ready player One"); + //sprintf (msg, "Get ready player One"); break; case 1: halfdelay (speed); + rotateblock (cblock, rot); + displayblock (board, cblock, xblock, yblock); + rot = 0; break; } msgwindow (msg, xmsg, ymsg, lmsg); @@ -208,6 +222,7 @@ int main (int argc, char *argv[]) case ' ': case 'i': case 'o': + rot = 1; break; case 'p': mode = (mode == 0) ? 1 : 0; @@ -232,6 +247,7 @@ int main (int argc, char *argv[]) case 127: case '\b': case 'u': + rot = -1; break; //case ERR: //default: -- 2.30.2