put element on board
authorLaurent Mazet <mazet@softndesign.org>
Fri, 21 Jun 2024 21:53:32 +0000 (23:53 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Fri, 21 Jun 2024 21:53:32 +0000 (23:53 +0200)
function.c
function.h
gameoflife.c

index 7155af7a564548257304daa3d2ea4160115e21b6..95ff8fdb5d8ba300ec4885110118dc74a6a3f1d3 100644 (file)
@@ -220,4 +220,54 @@ void computenextgen (board_t *board)
     freeboard (nextboard);
 }
 
+void putelement (board_t *board, board_t *element, int x, int y, int rot)
+{
+    int i, j;
+
+    rot = (rot > 0) ? rot % 4 : ((1 - rot / 4) * 4 + rot) % 4;
+
+    board_t *newelement = NULL;
+    if (rot % 2) {
+        newelement = initboard (element->xsize, element->ysize);
+    } else {
+        newelement = initboard (element->ysize, element->xsize);
+    }
+
+    switch (rot) {
+    case 0:
+        strcpy (newelement->tab, element->tab);
+        break;
+    case 1:
+        for (i = 0; i < element->xsize; i++) {
+            for (j = 0; j < element->ysize; j++) {
+                *getcell (newelement, element->ysize - 1 - j, i) = *getcell (element, i, j);
+            }
+        }
+        break;
+    case 2:
+        for (i = 0; i < element->xsize; i++) {
+            for (j = 0; j < element->ysize; j++) {
+                *getcell (newelement, element->xsize - 1 - i, element->ysize - 1 - j) = *getcell (element, i, j);
+            }
+        }
+        break;
+    case 3:
+        for (i = 0; i < element->xsize; i++) {
+            for (j = 0; j < element->ysize; j++) {
+                *getcell (newelement, j, element->xsize - 1 - i) = *getcell (element, i, j);
+            }
+        }
+        break;
+    }
+
+    for (i = 0; i < element->xsize; i++) {
+        for (j = 0; j < element->ysize; j++) {
+            *getcell (board, (x + i) % board->xsize, (y + j) % board->ysize) = *getcell (newelement, i, j);
+        }
+    }
+
+    freeboard (newelement);
+}
+
+
 /* vim: set ts=4 sw=4 et: */
index 4aab6998c5f32244250980e42e41d7166b23169f..67c868d48aba7b9ef1f1608cfd7a5955b9b70bac 100644 (file)
@@ -31,6 +31,8 @@ char *getcell (board_t *board, int x, int y);
 
 void computenextgen (board_t *board);
 
+void putelement (board_t *board, board_t *element, int x, int y, int rot);
+
 #endif /* __FUNCTION_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index a2495997a8ffa96a4a47d0fa8fc057159e890a0c..691533269eb81e374e3479cb0a5ea4036d1db0dd 100644 (file)
@@ -25,6 +25,8 @@ char *version = "0.1";
 
 char *file = NULL;
 char mode = '\0';
+int xdefault = 60;
+int ydefault = 20;
 
 char *help =
     "<i> Move up tile\n"
@@ -40,7 +42,7 @@ char *help =
 int usage (int ret)
 {
     FILE *fd = ret ? stderr : stdout;
-    fprintf (fd, "usage: %s [-e file] [-h] [-p file] [-v level]\n", progname);
+    fprintf (fd, "usage: %s [-e file] [-h] [-p file] [-v level] [-x int] [-y int]\n", progname);
     fprintf (fd, " -e: edit file (%s)\n", (file) ? file : "none");
     fprintf (fd, " -h: help message\n");
     fprintf (fd, " -p: play file (%s)\n", (file) ? file : "none");
@@ -53,6 +55,8 @@ int usage (int ret)
 /* main function */
 int main (int argc, char *argv[])
 {
+    int xsize = 0;
+    int ysize = 0;
 
     /* get basename */
     char *pt = progname = argv[0];
@@ -98,6 +102,22 @@ int main (int argc, char *argv[])
             }
             verbose = atoi (arg);
             break;
+        case 'x':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "%s: no width specified\n", progname));
+                return usage (1);
+            }
+            xsize = atoi (arg);
+            break;
+        case 'y':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "%s: no height specified\n", progname));
+                return usage (1);
+            }
+            ysize = atoi (arg);
+            break;
         case 'h':
         default:
             return usage (c != 'h');
@@ -110,17 +130,25 @@ int main (int argc, char *argv[])
     }
 
     /* init board */
+    if (xsize <= 0) {
+        xsize = xdefault;
+    }
+    if (ysize <= 0) {
+        ysize = ydefault;
+    }
+    board_t *board = initboard (xsize, ysize);
+
     char *buffer = readdata (file);
-    board_t *board = NULL;
+    board_t *element = NULL;
+    int rot = 0;
     if (buffer) {
-        board = loadboard (buffer);
+        element = loadboard (buffer);
         free (buffer);
         if (board == NULL) {
             VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", file));
             return 1;
         }
-    } else {
-        board = initboard (60, 20);
+        putelement (board, element, (xsize - element->xsize) / 2, (ysize - element->ysize) / 2, rot);
     }
 
     /* window positions */
@@ -171,6 +199,11 @@ int main (int argc, char *argv[])
             break;
         case ' ':
         case 'v':
+            if (element) {
+                cleanboard (board);
+                rot = (rot + 1) % 4;
+                putelement (board, element, (xsize - element->xsize) / 2, (ysize - element->ysize) / 2, rot);
+            }
             break;
         case KEY_BACKSPACE:
         case KEY_DELETE:
@@ -185,6 +218,7 @@ int main (int argc, char *argv[])
 
     endwin ();
 
+    freeboard (element);
     freeboard (board);
 
     return 0;