From e643427fd68351e65cd4cab70cc8a40a5ee194f9 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Fri, 23 Aug 2024 00:21:35 +0200 Subject: [PATCH] save is ok --- constant.c | 20 +++++++-------- function.c | 70 +++++++++++++++++++++++++++++++++++------------------ function.h | 2 +- pentomino.c | 27 +++++++++++---------- type.h | 4 --- 5 files changed, 71 insertions(+), 52 deletions(-) diff --git a/constant.c b/constant.c index ac91dd9..630fd00 100644 --- a/constant.c +++ b/constant.c @@ -27,18 +27,18 @@ int yoffset = 1; #define _nb_blocks_std 12 block_t _blocks_std[_nb_blocks_std] = { - {3, 3, yellow, " .... . "}, // F - {1, 5, blue, "...."}, // I + {3, 3, yellow, " .... . "}, // F + {1, 5, blue, "....."}, // I {2, 4, lightmagenta, ". . . .."}, // L - {2, 4, lightblue, " .... . "}, // N - {2, 3, lightgreen, " ....."}, // P - {3, 3, lightcyan, "... . . "}, // T - {3, 2, magenta, ". ...."}, // U - {3, 3, cyan, ". . ..."}, // V + {2, 4, lightblue, " .... . "}, // N + {2, 3, lightgreen, " ....."}, // P + {3, 3, lightcyan, "... . . "}, // T + {3, 2, magenta, ". ...."}, // U + {3, 3, cyan, ". . ..."}, // V {3, 3, lightergreen, ". .. .."}, // W - {3, 3, red, " . ... . "}, // X - {2, 4, darkblue, " ... . ."}, // Y - {3, 3, brown, ".. . .."}, // Z + {3, 3, red, " . ... . "}, // X + {2, 4, darkblue, " ... . ."}, // Y + {3, 3, brown, ".. . .."}, // Z }; blocks_t *getblocks (char *name) diff --git a/function.c b/function.c index 8d84e7d..409b514 100644 --- a/function.c +++ b/function.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -34,8 +35,6 @@ board_t *initboard (int width, int height) board->ysize = board->height = height; board->xoffset = 0; board->yoffset = 0; - board->current = -1; - board->next = -1; return board; } @@ -84,9 +83,44 @@ int _makecomments (char *buffer, board_t *board) return l; } -char *saveboard (board_t *board) +char _itoz (int x) { - int size = 6 * (8 + 3) + 8 + board->width * board->height + 1; + return (x < 10) ? '0' + x : 'A' + x - 10; +} + +int _sprinttab (char *buffer, char *name, int *tab, int nb) +{ + int i; + int l = sprintf (buffer, "%s: \"", name); + for (i = 0; i < nb; i++) { + l += sprintf (buffer + l, "%c", _itoz (tab[i])); + } + l += sprintf (buffer + l, "\"\n"); + return l; +} + +int _sprintblock (char *buffer, int id, block_t *block) +{ + int i; + int l = sprintf (buffer, "width[%d]: %d\n", id, block->width); + l += sprintf (buffer + l, "height[%d]: %d\n", id, block->height); + l += sprintf (buffer + l, "color[%d]: %d\n", id, block->color); + l += sprintf (buffer + l, "block[%d]: \"", id); + for (i = 0; i < block->width * block->height; i++) { + l += sprintf (buffer + l, "%c", block->tab[i]); + } + l += sprintf (buffer + l, "\"\n"); + return l; +} + +char *saveboard (board_t *board, blocks_t *blocks) +{ + int i; + int size = 3 * (8 + 3) + 8 + board->width * board->height + 1; + size += 3 * (8 + blocks->nb + 1); + for (i = 0; i < blocks->nb; i++) { + size += 3 * (13 + 3) + 14 + blocks->block[i]->width * blocks->block[i]->height + 1; + } VERBOSE (INFO, size += board->height * (8 + board->width)); char *buffer = (char *) calloc (size, 1); @@ -95,10 +129,14 @@ char *saveboard (board_t *board) int l = sprintf (buffer, "width: %d\n", board->width); l += sprintf (buffer + l, "height: %d\n", board->height); l += sprintf (buffer + l, "tab: \"%s\"\n", board->tab); - l += sprintf (buffer + l, "current: %d\n", board->current); - l += sprintf (buffer + l, "lines: %d\n", board->lines); - l += sprintf (buffer + l, "next: %d\n", board->next); - l += sprintf (buffer + l, "score: %d\n", board->score); + l += sprintf (buffer + l, "nb: %d\n", blocks->nb); + l += _sprinttab (buffer + l, "x", blocks->x, blocks->nb); + l += _sprinttab (buffer + l, "y", blocks->y, blocks->nb); + l += _sprinttab (buffer + l, "settle", blocks->settle, blocks->nb); + for (i = 0; i < blocks->nb; i++) { + l += _sprintblock (buffer + l, i, blocks->block[i]); + } + assert (l <= size); VERBOSE (INFO, _makecomments (buffer + l, board)); @@ -165,10 +203,6 @@ board_t *loadboard (char *str) int width = 0; int height = 0; char *tab = NULL; - int current = -1; - int lines = 0; - int next = -1; - int score = 0; char *saveptr1, *saveptr2; @@ -188,14 +222,6 @@ board_t *loadboard (char *str) height = atoi (value); } else if (strcmp (keyword, "tab") == 0) { tab = atos (value); - } else if (strcmp (keyword, "current") == 0) { - current = atoi (value); - } else if (strcmp (keyword, "lines") == 0) { - lines = atoi (value); - } else if (strcmp (keyword, "next") == 0) { - next = atoi (value); - } else if (strcmp (keyword, "score") == 0) { - score = atoi (value); } else if (strcmp (keyword, "rem") == 0) { /* nothing to do with remark */ } else { @@ -209,10 +235,6 @@ board_t *loadboard (char *str) if ((tab) && (strlen (tab) == (size_t)(width * height))) { board = initboard (width, height); memcpy (board->tab, tab, width * height); - board->current = current; - board->lines = lines; - board->next = next; - board->score = score; } return board; diff --git a/function.h b/function.h index 713d8c5..4662089 100644 --- a/function.h +++ b/function.h @@ -29,7 +29,7 @@ void freeboard (board_t *board); int _makecomments (char *buffer, board_t *board); -char *saveboard (board_t *board); +char *saveboard (board_t *board, blocks_t *blocks); int writedata (char *filename, char *data); diff --git a/pentomino.c b/pentomino.c index cc7d78a..703a9f0 100644 --- a/pentomino.c +++ b/pentomino.c @@ -178,7 +178,6 @@ int main (int argc, char *argv[]) } } VERBOSE (DEBUG, fprintf (stderr, "block: %dx%d\n", wblock, hblock)); - board_t *bench; int n = 0; switch (scale) { case 0: @@ -192,13 +191,9 @@ int main (int argc, char *argv[]) n = 3; break; } - bench = initboard (xoffset + (xoffset + wblock) * (blocks->nb) / n, (n - 1) * yoffset + n * hblock); + board_t *bench = initboard (xoffset + (xoffset + wblock) * (blocks->nb) / n, (n - 1) * 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 + hblock) * (i % n) + (hblock - blocks->block[i]->height + 1) / 2; - } /* init curses window */ initscr (); @@ -222,19 +217,19 @@ int main (int argc, char *argv[]) int ycursor = (board->height - blocks->block[cursor]->height) / 2; /* window positions (next) */ - board_t *next = initboard (wblock + 2 * xoffset, hblock); + board_t *next = initboard (max (wblock, hblock) + 2 * xoffset, max (wblock, hblock)); setscale (next, scale); int xnext = next->xoffset = xboard + board->xsize + xoffset + 2; int ynext = next->yoffset = yboard; /* window positions (bench) */ int xbench = bench->xoffset = xboard; - int ybench = bench->yoffset = yboard + max (board->ysize, next->ysize) + 1 + yoffset; + int ybench = bench->yoffset = max (yboard + board->ysize, ynext + next->ysize) + 1 + yoffset; /* window positions (help) */ - int xhelp = xbench + bench->xsize + xoffset + 1; + int xhelp = max (xbench + bench->xsize, xnext + next->xsize) + xoffset + 1; int yhelp = yboard - 1; - int lhelp = helpwindow (help, xhelp, yhelp); + helpwindow (help, xhelp, yhelp); /* window positions (msg) */ int xmsg = xbench; @@ -244,7 +239,9 @@ int main (int argc, char *argv[]) /* blocks positions */ boardwindow (bench, 1); for (i = 0; i < blocks->nb; i++) { - displayblock (bench, blocks->block[i], blocks->x[i], blocks->y[i]); + int x = xoffset + (xoffset + wblock) * (i / n) + (wblock - blocks->block[i]->width + 1) / 2; + int y = (yoffset + hblock) * (i % n) + (hblock - blocks->block[i]->height + 1) / 2; + displayblock (bench, blocks->block[i], x, y); } /* event loop */ @@ -262,7 +259,9 @@ int main (int argc, char *argv[]) boardwindow (next, 0); displayblock (board, block, xcursor, ycursor); } - displayblock (next, block, xoffset + (wblock - block->width) / 2, (hblock - block->height) / 2); + int x = xoffset + (max (wblock, hblock) - block->width + 1) / 2; + int y = (max (wblock, hblock) - block->height) / 2; + displayblock (next, block, x, y); msgwindow ("Can you solve this puzzle?", xmsg, ymsg, lmsg); break; case 1: @@ -295,7 +294,7 @@ int main (int argc, char *argv[]) case 's': savename = savewindow (savelen, xsave, ysave); if (savename != NULL) { - char *ptr = saveboard (board); + char *ptr = saveboard (board, blocks); if (writedata (savename, ptr)) { VERBOSE (WARNING, printf ("issue writing Board\n")); } @@ -395,6 +394,8 @@ int main (int argc, char *argv[]) free (rec); freeboard (board); + freeboard (bench); + freeboard (next); freeblocks (blocks); return 0; diff --git a/type.h b/type.h index c912717..e0e2570 100644 --- a/type.h +++ b/type.h @@ -10,10 +10,6 @@ typedef struct { int ysize; int xoffset; int yoffset; - int current; - int lines; - int next; - int score; } board_t; typedef struct { -- 2.30.2