From 0907bfebd94e7ce8a705c52980c77cc4a94d02ce Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Fri, 21 Jun 2024 23:53:32 +0200 Subject: [PATCH] put element on board --- function.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ function.h | 2 ++ gameoflife.c | 44 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 91 insertions(+), 5 deletions(-) diff --git a/function.c b/function.c index 7155af7..95ff8fd 100644 --- a/function.c +++ b/function.c @@ -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: */ diff --git a/function.h b/function.h index 4aab699..67c868d 100644 --- a/function.h +++ b/function.h @@ -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: */ diff --git a/gameoflife.c b/gameoflife.c index a249599..6915332 100644 --- a/gameoflife.c +++ b/gameoflife.c @@ -25,6 +25,8 @@ char *version = "0.1"; char *file = NULL; char mode = '\0'; +int xdefault = 60; +int ydefault = 20; char *help = " 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; -- 2.30.2