From: Laurent Mazet Date: Sat, 17 Aug 2024 19:48:54 +0000 (+0200) Subject: blocks appear X-Git-Tag: v1.0~11 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=1beddc419b5b768165604a432da5d4a207d70484;p=pentomino.git blocks appear --- diff --git a/constant.c b/constant.c index 3629180..ac91dd9 100644 --- a/constant.c +++ b/constant.c @@ -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); diff --git a/constant.h b/constant.h index 00de5ac..d535651 100644 --- a/constant.h +++ b/constant.h @@ -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); diff --git a/display.c b/display.c index f8d85a3..e42f430 100644 --- 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); } } } diff --git a/display.h b/display.h index 4cd615a..63af1ba 100644 --- 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); diff --git a/function.c b/function.c index cfa5471..cfd96da 100644 --- a/function.c +++ b/function.c @@ -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: */ diff --git a/function.h b/function.h index 335fca6..3c82c94 100644 --- a/function.h +++ b/function.h @@ -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: */ diff --git a/pentomino.c b/pentomino.c index 9a049cf..3f8c5ae 100644 --- a/pentomino.c +++ b/pentomino.c @@ -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 199c75f..9f49930 100644 --- 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: */