From e0b2ac87503a79d49f7130e558ea9d1bc5ead4bc Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Thu, 27 Jun 2024 18:57:22 +0200 Subject: [PATCH] first code for shrinking board --- function.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++---- function.h | 4 +++- gameoflife.c | 8 +++++-- todo.txt | 3 ++- 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/function.c b/function.c index 82ecba5..8c3bb5b 100644 --- a/function.c +++ b/function.c @@ -47,15 +47,15 @@ board_t *copyboard (board_t *dst, board_t *src) return dst; } -board_t *resizeboard (board_t *board, int xsize, int ysize) +board_t *resizeboard (board_t *board, int xsize, int ysize, int xoffset, int yoffset) { int i, j; board_t *newboard = initboard (xsize, ysize); - for (i = 0; (i < board->xsize) && (i < xsize); i++) { - for (j = 0; (j < board->ysize) && (j < ysize); j++) { - *getcell (newboard, i, j) = *getcell (board, i, j); + for (i = 0; (i + xoffset < board->xsize) && (i < xsize); i++) { + for (j = 0; (j + yoffset < board->ysize) && (j < ysize); j++) { + *getcell (newboard, i, j) = *getcell (board, i + xoffset, j + yoffset); } } @@ -65,6 +65,66 @@ board_t *resizeboard (board_t *board, int xsize, int ysize) return board; } +board_t *shrinkboard (board_t *board) +{ + int imin = 0; + int j = 0; + while (imin < board->xsize) { + if (*getcell (board, imin, j) != ' ') { + break; + } + j++; + if (j == board->ysize) { + imin++; + j = 0; + } + } + if (imin == board->xsize) { + return NULL; + } + + int i = imin; + int jmin = 0; + while (jmin < board->ysize) { + if (*getcell (board, i, jmin) != ' ') { + break; + } + i++; + if (i == board->xsize) { + i = imin; + jmin++; + } + } + + i = imin; + int jmax = board->ysize - 1; + while (jmax >= 0) { + if (*getcell (board, i, jmax) != ' ') { + break; + } + i++; + if (i == board->xsize) { + i = imin; + jmax--; + } + } + + int imax = board->xsize - 1; + j = jmin; + while (imax >= 0) { + if (*getcell (board, imax, j) != ' ') { + break; + } + j++; + if (j == jmax) { + imax--; + j = jmin; + } + } + + return resizeboard (board, imax - imin + 1, jmax - jmin + 1, imin, jmin); +} + void freeboard (board_t *board) { if (board) { diff --git a/function.h b/function.h index 7179b71..1c94d7f 100644 --- a/function.h +++ b/function.h @@ -17,7 +17,9 @@ board_t *initboard (int xsize, int ysize); board_t *copyboard (board_t *dst, board_t *src); -board_t *resizeboard (board_t *board, int xsize, int ysize); +board_t *resizeboard (board_t *board, int xsize, int ysize, int xoffset, int yoffset); + +board_t *shrinkboard (board_t *board); void freeboard (board_t *board); diff --git a/gameoflife.c b/gameoflife.c index 0c2fa5e..3a6e8a2 100644 --- a/gameoflife.c +++ b/gameoflife.c @@ -183,7 +183,7 @@ int main (int argc, char *argv[]) } board_t *board = NULL; if (playground) { - board = resizeboard (playground, xsize, ysize); + board = resizeboard (playground, xsize, ysize, 0, 0); } else { board = initboard (xsize, ysize); } @@ -284,7 +284,11 @@ int main (int argc, char *argv[]) case 's': savename = savewindow (savelen, xsave, ysave); if (savename != NULL) { - ptr = saveboard (board, "Board"); + board_t *miniboard = shrinkboard (board); + board_t *temp = resizeboard (miniboard, miniboard->xsize + 2, miniboard->ysize + 2, 1, 1); + freeboard (miniboard); + ptr = saveboard (temp, "Board"); + freeboard (temp); if (writedata (savename, ptr)) { VERBOSE (WARNING, printf ("issue writing Board\n")); } diff --git a/todo.txt b/todo.txt index 6da5df2..8cd5c5f 100644 --- a/todo.txt +++ b/todo.txt @@ -1,3 +1,4 @@ = correction sur rotate = gestion bibliothèque -- amélioration sauvegarde += amélioration sauvegarde +- reduction -- 2.30.2