blocks appear
authorLaurent Mazet <mazet@softndesign.org>
Sat, 17 Aug 2024 19:48:54 +0000 (21:48 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 17 Aug 2024 19:48:54 +0000 (21:48 +0200)
constant.c
constant.h
display.c
display.h
function.c
function.h
pentomino.c
type.h

index 3629180dd244cc3c771771faa55511d477606f92..ac91dd98b0b035ca1c994a1dd94b116691e7a958 100644 (file)
@@ -41,16 +41,23 @@ block_t _blocks_std[_nb_blocks_std] = {
     {3, 3, brown, "..  .  .."}, // Z
 };
 
-block_t *getblocks (char *name, int *nb)
+blocks_t *getblocks (char *name)
 {
     block_t *pt = NULL;
+    int nb;
+    int i;
 
     if (strcmp (name, "std") == 0) {
+        nb = _nb_blocks_std;
         pt = _blocks_std;
-        *nb = _nb_blocks_std;
     }
 
-    return pt;
+    blocks_t *blocks = initblocks (nb);
+    for (i = 0; i < nb; i++) {
+        blocks->block[i] = copyblock (pt + i);
+    }
+
+    return blocks;
 }
 
 /* board */
@@ -60,13 +67,13 @@ board_t *getboard (char *name)
     board_t *board = NULL;
 
     if (strcmp (name, "6x10") == 0) {
-        board = initboard (6, 10);
+        board = initboard (10, 6);
     } else if (strcmp (name, "5x12") == 0) {
-        board = initboard (5, 12);
+        board = initboard (12, 5);
     } else if (strcmp (name, "4x15") == 0) {
-        board = initboard (4, 15);
+        board = initboard (15, 4);
     } else if (strcmp (name, "3x20") == 0) {
-        board = initboard (3, 20);
+        board = initboard (20, 3);
     } else if (strcmp (name, "list") == 0) {
         printf ("board: 6x10 5x12 4x15 3x20\n");
         board = (board_t *)(-1);
index 00de5ac0db317741884765f6fd66605370d44c5e..d535651d8f1f0e06e6a95afdead87404fe7b7460 100644 (file)
@@ -15,7 +15,7 @@ extern int yoffset;
 
 /* block definitions */
 
-block_t *getblocks (char *name, int *nb);
+blocks_t *getblocks (char *name);
 
 board_t *getboard (char *name);
 
index f8d85a35bb1fe172ec6643c61b25c0004fd9f1ad..e42f43086ece301b1edcc6242638f027c806d7dc 100644 (file)
--- a/display.c
+++ b/display.c
@@ -66,82 +66,52 @@ int helpwindow (char *msg, int xoffset, int yoffset)
     return j;
 }
 
-void _put_color_block (int y, int x, char symb)
+void _element0 (board_t *board, int x, int y, cblock_t color)
 {
-    switch (symb) {
-    case ' ':
-        mvaddcb (y, x, black);
-        break;
-    case '1':
-        mvaddcb (y, x, cyan);
-        break;
-    case '2':
-        mvaddcb (y, x, yellow);
-        break;
-    case '3':
-        mvaddcb (y, x, magenta);
-        break;
-    case '4':
-        mvaddcb (y, x, brown);
-        break;
-    case '5':
-        mvaddcb (y, x, blue);
-        break;
-    case '6':
-        mvaddcb (y, x, red);
-        break;
-    case '7':
-        mvaddcb (y, x, green);
-        break;
-    case '8':
-        mvaddcb (y, x, white);
-        break;
-    }
+    mvaddcb (board->yoffset + y, board->xoffset + x, color);
 }
 
-void _element0 (board_t *board, int x, int y, int symb)
+void _element1 (board_t *board, int x, int y, cblock_t color)
 {
-    _put_color_block (board->yoffset + y, board->xoffset + x, symb);
+    mvaddcb (board->yoffset + y, board->xoffset + 2 * x, color);
+    mvaddcb (board->yoffset + y, board->xoffset + 2 * x + 1, color);
 }
 
-void _element1 (board_t *board, int x, int y, int symb)
+void _element2 (board_t *board, int x, int y, cblock_t color)
 {
-    _put_color_block (board->yoffset + y, board->xoffset + 2 * x, symb);
-    _put_color_block (board->yoffset + y, board->xoffset + 2 * x + 1, symb);
+    mvaddcb (board->yoffset + 2 * y, board->xoffset + 2 * x, color);
+    mvaddcb (board->yoffset + 2 * y, board->xoffset + 2 * x + 1, color);
+    mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 2 * x, color);
+    mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 2 * x + 1, color);
 }
 
-void _element2 (board_t *board, int x, int y, int symb)
+void _element3 (board_t *board, int x, int y, cblock_t color)
 {
-    _put_color_block (board->yoffset + 2 * y, board->xoffset + 2 * x, symb);
-    _put_color_block (board->yoffset + 2 * y, board->xoffset + 2 * x + 1, symb);
-    _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 2 * x, symb);
-    _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 2 * x + 1, symb);
+    mvaddcb (board->yoffset + 2 * y, board->xoffset + 3 * x, color);
+    mvaddcb (board->yoffset + 2 * y, board->xoffset + 3 * x + 1, color);
+    mvaddcb (board->yoffset + 2 * y, board->xoffset + 3 * x + 2, color);
+    mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 3 * x, color);
+    mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 1, color);
+    mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 2, color);
 }
 
-void _element3 (board_t *board, int x, int y, int symb)
-{
-    _put_color_block (board->yoffset + 2 * y, board->xoffset + 3 * x, symb);
-    _put_color_block (board->yoffset + 2 * y, board->xoffset + 3 * x + 1, symb);
-    _put_color_block (board->yoffset + 2 * y, board->xoffset + 3 * x + 2, symb);
-    _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 3 * x, symb);
-    _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 1, symb);
-    _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 2, symb);
-}
-
-void _element (board_t *board, int x, int y, int symb)
+void _element (board_t *board, int x, int y, cblock_t color)
 {
+    if ((x < 0) || (x >= board->width) || (y < 0) || (y >= board->height)) {
+        return;
+    }
     switch (board->scale) {
     case 0:
-        _element0 (board, x, y, symb);
+        _element0 (board, x, y, color);
         break;
     case 1:
-        _element1 (board, x, y, symb);
+        _element1 (board, x, y, color);
         break;
     case 2:
-        _element2 (board, x, y, symb);
+        _element2 (board, x, y, color);
         break;
     case 3:
-        _element3 (board, x, y, symb);
+        _element3 (board, x, y, color);
         break;
     }
 }
@@ -156,7 +126,7 @@ void boardwindow (board_t *board, int mode)
 
     for (i = 0; i < board->width; i++) {
         for (j = 0; j < board->height; j++) {
-            _element (board, i, j, *getcell (board, i, j));
+            _element (board, i, j, *getcell (board, i, j) - ' ');
         }
     }
 }
@@ -165,18 +135,10 @@ void displayblock (board_t *board, block_t *block, int x, int y)
 {
     int i, j;
 
-    if (x == -1) {
-        x = board->width / 2;
-    }
-
-    if (y == -1) {
-        y = (board->height - block->height) / 2;
-    }
-
     for (i = 0; i < block->width; i++) {
         for (j = 0; j < block->height; j++) {
             if (*getcell (block, i, j) != ' ') {
-                _element (board, x - block->width / 2 + i, y + j, '0' + block->color);
+                _element (board, x + i, y + j, block->color);
             }
         }
     }
index 4cd615a63111624b0dac89a63156d8cf9d894c30..63af1baea18241dfb328b54df2108dab0ba07f3f 100644 (file)
--- a/display.h
+++ b/display.h
@@ -14,18 +14,6 @@ void _dobound (int xsize, int ysize, int xoffset, int yoffset);
 
 int helpwindow (char *msg, int xoffset, int yoffset);
 
-void _put_color_block (int y, int x, char symb);
-
-void _element0 (board_t *board, int x, int y, int symb);
-
-void _element1 (board_t *board, int x, int y, int symb);
-
-void _element2 (board_t *board, int x, int y, int symb);
-
-void _element3 (board_t *board, int x, int y, int symb);
-
-void _element (board_t *board, int x, int y, int symb);
-
 void boardwindow (board_t *board, int mode);
 
 void displayblock (board_t *board, block_t *block, int x, int y);
index cfa5471f8d58fca0179c56de330a19ea1b6622d3..cfd96da7952bf5c880434f7c114126ae4ae6086a 100644 (file)
@@ -308,4 +308,32 @@ block_t *rotateblock (block_t *block, int rot)
     return block;
 }
 
+blocks_t *initblocks (int nb)
+{
+    blocks_t *blocks = (blocks_t *) calloc (1, sizeof (blocks_t));
+    CHECKALLOC (blocks);
+
+    blocks->nb = nb;
+    blocks->x = (int *) calloc (nb, sizeof (int));
+    CHECKALLOC (blocks->x);
+    blocks->y = (int *) calloc (nb, sizeof (int));
+    CHECKALLOC (blocks->y);
+    blocks->block = (block_t **) calloc (nb, sizeof (block_t *));
+    CHECKALLOC (blocks->block);
+
+    return (blocks);
+}
+
+void freeblocks (blocks_t *blocks)
+{
+    int i;
+    for (i = 0; i < blocks->nb; i++) {
+        freeblock (blocks->block[i]);
+    }
+    free (blocks->x);
+    free (blocks->y);
+    free (blocks->block);
+    free (blocks);
+}
+
 /* vim: set ts=4 sw=4 et: */
index 335fca6aa106a302d7c10ceecc20acd81d4b4b7d..3c82c945748d5bf95be48790284f088e6f8f4fc6 100644 (file)
@@ -49,6 +49,10 @@ void freeblock (block_t *block);
 
 block_t *rotateblock (block_t *block, int rot);
 
+blocks_t *initblocks (int nb);
+
+void freeblocks (blocks_t *blocks);
+
 #endif /* __FUNCTION_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index 9a049cf56e5f65d82df7a2ae6d33fecf1243fe2a..3f8c5aed0a6e3f56122c84c021161068ca2b9924 100644 (file)
@@ -49,6 +49,7 @@ int usage (int ret)
 /* main function */
 int main (int argc, char *argv[])
 {
+    int i;
 
     /* get basename */
     char *pt = progname = argv[0];
@@ -112,7 +113,7 @@ int main (int argc, char *argv[])
         return 1;
     }
 
-    /* load playground */
+    /* load playground or define it */
     board_t *board = NULL;
     if (filename) {
         char *buffer = readdata (filename);
@@ -126,7 +127,7 @@ int main (int argc, char *argv[])
             VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", filename));
             return 1;
         }
-    } else if (boardname) {
+    } else {
         board = getboard (boardname);
         if (board == (board_t *)(-1)) {
             return 0;
@@ -138,6 +139,44 @@ int main (int argc, char *argv[])
     }
     setscale (board, scale);
 
+    /* gets blocks */
+    blocks_t *blocks = getblocks ("std");
+
+    /* define work bench */
+    int wblock = 0;
+    int hblock = 0;
+    for (i = 0; i < blocks->nb; i++) {
+        block_t *block = blocks->block[i];
+        if (wblock < block->width) {
+            wblock = block->width;
+        }
+        if (hblock < block->height) {
+            hblock = block->height;
+        }
+    }
+    VERBOSE (DEBUG, fprintf (stderr, "block: %dx%d\n", wblock, hblock));
+    board_t *bench;
+    int n = 0;
+    switch (scale) {
+    case 0:
+        n = 1;
+        break;
+    case 1:
+    case 2:
+        n = 2;
+        break;
+    case 3:
+        n = 3;
+        break;
+    }
+    bench = initboard (xoffset + (xoffset + wblock) * (blocks->nb) / n, (1 + n) * yoffset + n * hblock);
+    VERBOSE (DEBUG, fprintf (stderr, "windows: %dx%d\n", xoffset + (xoffset + wblock) * (blocks->nb + n - 1) / n, (1 + n) * yoffset + n * hblock));
+    setscale (bench, scale);
+    for (i = 0; i < blocks->nb; i++) {
+        blocks->x[i] = xoffset + (xoffset + wblock) * (i / n) + (wblock - blocks->block[i]->width + 1) / 2;
+        blocks->y[i] = yoffset + (yoffset + hblock) * (i % n) + (hblock - blocks->block[i]->height + 1) / 2; 
+    }
+
     /* init curses window */
     initscr ();
     noecho ();
@@ -151,26 +190,110 @@ int main (int argc, char *argv[])
     int xboard = board->xoffset = xoffset + 1;
     int yboard = board->yoffset = xoffset + 1;
     int xhelp = xboard + xoffset + 1 + board->xsize;
-    int xcursor = 0;
-    int ycursor = 0;
+    int xcursor = board->width / 2;
+    int ycursor = board->height / 2;
+    int cursor = 0;
     int yhelp = yboard - 1;
     int xsave = max (xboard + (board->xsize - savelen) / 2, 1);
     int ysave = yboard + (board->ysize - 1) / 2;
+
     char *savename = NULL;
 
     /* help window */
     int lhelp = helpwindow (help, xhelp, yhelp);
 
     /* window positions */
-    int xmsg = xboard;
-    int ymsg = max (yboard + xoffset + 1 + board->ysize, yhelp + lhelp + yoffset + 1);
+    int xblocks = bench->xoffset = xboard;
+    int yblocks = bench->yoffset = max (yboard + board->ysize + 1, yhelp + lhelp) + yoffset + 1;
+    int xmsg = xblocks;
+    int ymsg = yblocks + yoffset + 2;
     int lmsg = xhelp - xmsg + strmaxlen (help, '\n');
 
+    /* blocks positions */
 
+    /* event loop */
+    int stop = 0;
+    while (!stop) {
+        boardwindow (board, 0);
+        boardwindow (bench, 0);
+        for (i = 0; i < blocks->nb; i++) {
+            displayblock (bench, blocks->block[i], blocks->x[i], blocks->y[i]);
+            VERBOSE (DEBUG, fprintf (stderr, "block %d: %dx%d (%d, %d)\n", i, blocks->block[i]->width, blocks->block[i]->height, blocks->x[i], blocks->y[i]));
+        }
 
+        block_t *block = blocks->block[cursor];
+        displayblock (board, block, xcursor, ycursor);
 
+        if (1) { //if (!endofgame (board)) {
+        //    cursorwindow (board, xcursor, ycursor, mode);
+        } else {
+            msgwindow ("End of game", xmsg, ymsg, lmsg);
+        }
 
+        int ch = getch ();
+        switch (ch) {
+        case ' ':
+        case 'u':
+           cursor++;
+           if (cursor >= blocks->nb) {
+               cursor = 0;
+           }
+        case '\n':
+        case '\r':
+        case 'o':
+            break;
+        case KEY_UP:
+        case 'i':
+            if (ycursor > - (block->height + 0) / 2) {
+                ycursor--;
+            }
+            break;
+        case KEY_LEFT:
+        case 'j':
+            if (xcursor > - (block->width + 0) / 2) {
+                xcursor--;
+            }
+            break;
+        case KEY_DOWN:
+        case 'k':
+            VERBOSE (DEBUG, fprintf (stderr, "DOWN: %d %d\n", ycursor, board->height - (block->height) / 1 + (block->height % 2 ? 0 : 1)));
+            if (ycursor < board->height - (block->height + 1) / 2) {
+                ycursor++;
+            }
+            break;
+        case KEY_RIGHT:
+        case 'l':
+            VERBOSE (DEBUG, fprintf (stderr, "RIGHT: %d %d\n", xcursor, board->width - (block->width) / 1 + (block->width % 2 ? 0 : 1)));
+            if (xcursor < board->width - (block->width + 1) / 2) {
+                xcursor++;
+            }
+            break;
+        case KEY_ESC:
+        case 'q':
+            stop = 1;
+            break;
+        case 's':
+            savename = savewindow (savelen, xsave, ysave);
+            if (savename != NULL) {
+                char *ptr = saveboard (board);
+                if (writedata (savename, ptr)) {
+                    VERBOSE (WARNING, printf ("issue writing Board\n"));
+                }
+                free (ptr);
+                free (savename);
+            }
+            break;
+        case KEY_BACKSPACE:
+        case KEY_DELETE:
+        case 127:
+        case '\b':
+            break;
+        //case ERR:
+        //default:
+        }
+    }
 
+    /* cleaning before quiting */
     endwin ();
 
     freeboard (board);
diff --git a/type.h b/type.h
index 199c75f7edc3501d218feccc8914e6c495e2450a..9f49930a0b254dc810c43c445aff844c82f045a0 100644 (file)
--- a/type.h
+++ b/type.h
@@ -23,6 +23,13 @@ typedef struct {
     char *tab;
 } block_t;
 
+typedef struct {
+    int nb;
+    int *x;
+    int *y;
+    block_t **block;
+} blocks_t;
+
 #endif /* __TYPE_H__ */
 
 /* vim: set ts=4 sw=4 et: */