first block on board
authorLaurent Mazet <mazet@softndesign.org>
Mon, 22 Jul 2024 11:35:51 +0000 (13:35 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Mon, 22 Jul 2024 11:35:51 +0000 (13:35 +0200)
display.c
display.h
function.c
function.h
tetris.c

index 467787c60bcc846b6e125be2425d299b430fda40..12fd83b1c1879cffa77a8037fa1289436e3fae91 100644 (file)
--- 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);
+            }
         }
     }
 }
index df04aa748f60a35b9b1d306f075f852939d0d4b3..d04169d18196890ca593f008575875afce9fdd02 100644 (file)
--- 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);
index 154833d7f4cb5b688680d4485961df8e4a21f4fb..ea76a938cd6e66188d5f883c3e4a41f51ba5b864 100644 (file)
@@ -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: */
index 883808e528a15e8c93cf3c0bc5a1f48d91aac154..e7a5340ea74b57ded8b5e8219a0ec33f9d49be09 100644 (file)
@@ -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__ */
 
index da41f710c99ab1fc07ac0325a04a362c7f3016f6..a1e331cadf85c3e54c74218591ee5cd0db0b109e 100644 (file)
--- 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: