first code for shrinking board
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 27 Jun 2024 16:57:22 +0000 (18:57 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 27 Jun 2024 16:57:22 +0000 (18:57 +0200)
function.c
function.h
gameoflife.c
todo.txt

index 82ecba57988e3eb8dc9b8fa2aac8193eaaf4a1a3..8c3bb5b5d9736c7bab38e0bec060e3d68f6be80e 100644 (file)
@@ -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) {
index 7179b71e6127bd0d56f1888d345763ed676da532..1c94d7fc04aa1992a527017d30309d03e2352a9b 100644 (file)
@@ -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);
 
index 0c2fa5e90f6e75ab5a78b920d11a769d4d12ab13..3a6e8a2cc1eef17f10a11cb4e762b75aea3a2dbc 100644 (file)
@@ -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"));
                     }
index 6da5df2b5466b1ac9815c225ebc4e2869987c21a..8cd5c5f47c3d444c37f960ad0c5b993f7d011f50 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -1,3 +1,4 @@
 = correction sur rotate
 = gestion bibliothèque
-- amélioration sauvegarde
+= amélioration sauvegarde
+- reduction