From f8d4e444a252e69c5fba98c34b3e36a330378d59 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sat, 22 Jun 2024 22:10:28 +0200 Subject: [PATCH] most edit functions are avaliable --- display.c | 15 ++++++++ display.h | 2 + function.c | 46 +++++++++++++++++++--- function.h | 6 ++- gameoflife.c | 106 ++++++++++++++++++++++++++++++++++----------------- 5 files changed, 135 insertions(+), 40 deletions(-) diff --git a/display.c b/display.c index 36eb132..f52febf 100644 --- a/display.c +++ b/display.c @@ -133,4 +133,19 @@ void boardwindow (board_t *board, int xoffset, int yoffset, int bound) } } +void elementwindow (board_t *board, int xoffset, int yoffset, board_t *element, int x, int y) +{ + int i, j; + + for (i = 0; i < element->xsize; i++) { + for (j = 0; j < element->ysize; j++) { + if (*getcell (element, i, j) == 'X') { + set_color (blue); + mvaddch (yoffset + (y + j) % board->ysize, xoffset + (x + i) % board->xsize, ' '); + set_color (white); + } + } + } +} + /* vim: set ts=4 sw=4 et: */ diff --git a/display.h b/display.h index 555fb19..f4006db 100644 --- a/display.h +++ b/display.h @@ -7,6 +7,8 @@ int helpwindow (char *msg, int xoffset, int yoffset); void boardwindow (board_t *board, int xboard, int yboard, int bound); +void elementwindow (board_t *board, int xoffset, int yoffset, board_t *element, int x, int y); + #endif /* __DISPLAY_H__ */ /* vim: set ts=4 sw=4 et: */ diff --git a/function.c b/function.c index 95ff8fd..6a579c1 100644 --- a/function.c +++ b/function.c @@ -220,7 +220,7 @@ void computenextgen (board_t *board) freeboard (nextboard); } -void putelement (board_t *board, board_t *element, int x, int y, int rot) +void rotateelement (board_t *element, int rot) { int i, j; @@ -260,14 +260,50 @@ void putelement (board_t *board, board_t *element, int x, int y, int rot) break; } + strcpy (element->tab, newelement->tab); + + freeboard (newelement); +} + +void mirrorelement (board_t *element, int mode) +{ + int i, j; + + if (mode > 0) { /* verticaly */ + for (i = 0; i < element->xsize; i++) { + for (j = 0; j < element->ysize / 2; j++) { + char *pt1 = getcell (element, i, j); + char *pt2 = getcell (element, i, element->ysize - 1 - j); + char temp = *pt1; + *pt1 = *pt2; + *pt2 = temp; + } + } + } + if (mode < 0) { /* horizontaly */ + for (i = 0; i < element->xsize / 2 ; i++) { + for (j = 0; j < element->ysize; j++) { + char *pt1 = getcell (element, i, j); + char *pt2 = getcell (element, element->xsize - 1 - i, j); + char temp = *pt1; + *pt1 = *pt2; + *pt2 = temp; + } + } + } +} + +void putelement (board_t *board, board_t *element, int x, int y, int mode) +{ + int i, j; + 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); + if (*getcell (element, i, j) != ' ') { + *getcell (board, (x + i) % board->xsize, (y + j) % board->ysize) = (mode) ? 'X' : ' '; + } } } - - freeboard (newelement); } - /* vim: set ts=4 sw=4 et: */ diff --git a/function.h b/function.h index 67c868d..d7f34e1 100644 --- a/function.h +++ b/function.h @@ -31,7 +31,11 @@ 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); +void rotateelement (board_t *element, int rot); + +void mirrorelement (board_t *element, int mode); + +void putelement (board_t *board, board_t *element, int x, int y, int mode); #endif /* __FUNCTION_H__ */ diff --git a/gameoflife.c b/gameoflife.c index 6915332..28f01dc 100644 --- a/gameoflife.c +++ b/gameoflife.c @@ -25,18 +25,23 @@ char *version = "0.1"; char *file = NULL; char mode = '\0'; -int xdefault = 60; -int ydefault = 20; +int xoffset = 1; +int yoffset = 1; char *help = - " Move up tile\n" - " Move left tile\n" - " Move down tile\n" - " Move right tile\n" + "< > Next generation\n" + " Put cells\n" + " Mirror up/down\n" + " Rotate counter cw\n" + " Mirror left/right\n" + " Move up cells\n" + " Move left cells\n" + " Move down cells\n" + " Move right cells\n" " Quit\n" + " Rotate clockwise\n" " Save file\n" - " Put tile\n" - " Retrieve tile\n" + " Erase cells\n" ; int usage (int ret) @@ -129,87 +134,120 @@ int main (int argc, char *argv[]) return 1; } + /* init curses window */ + initscr (); + noecho (); + cbreak (); + nonl (); + keypad (stdscr, TRUE); + curs_set (0); + start_color (); + /* init board */ + int xmax, ymax; + getmaxyx(stdscr, ymax, xmax); if (xsize <= 0) { - xsize = xdefault; + xsize = xmax - (3 * xoffset + 2 + strmaxlen (help, '\n')); } if (ysize <= 0) { - ysize = ydefault; + ysize = ymax - 2 * (yoffset + 1); } board_t *board = initboard (xsize, ysize); + /* load data */ char *buffer = readdata (file); board_t *element = NULL; - int rot = 0; + int xelement = 0; + int yelement = 0; if (buffer) { element = loadboard (buffer); free (buffer); - if (board == NULL) { + if (element == NULL) { VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", file)); return 1; } - putelement (board, element, (xsize - element->xsize) / 2, (ysize - element->ysize) / 2, rot); + xelement = (xsize - element->xsize) / 2; + yelement = (ysize - element->ysize) / 2; } /* window positions */ - int xboard = 3; - int yboard = 3; - int xhelp = xboard + board->xsize + 3; + int xboard = xoffset + 1; + int yboard = xoffset + 1; + int xhelp = xboard + xoffset + 1 + board->xsize; int yhelp = yboard; - /* init curses window */ - initscr (); - noecho (); - cbreak (); - nonl (); - keypad (stdscr, TRUE); - curs_set (0); - - start_color (); - + /* init windows */ helpwindow (help, xhelp, yhelp); /* event loop */ + int rotate = 0; + int mirror = 0; int stop = 0; while (!stop) { boardwindow (board, xboard, yboard, 1); + if (element) { + rotateelement (element, rotate); + mirrorelement (element, mirror); + elementwindow (board, xboard, yboard, element, xelement, yelement); + } + rotate = 0; + mirror = 0; switch (getch ()) { + case ' ': case '\n': case '\r': computenextgen (board); break; + case 'c': + if (element) { + putelement (board, element, xelement, yelement, 1); + } + break; + case 'd': + mirror = -1; + break; + case 'e': + rotate = -1; + break; + case 'f': + mirror = 1; + break; case KEY_UP: case 'i': + yelement = (yelement + board->ysize - 1) % board->ysize; break; case KEY_LEFT: case 'j': + xelement = (xelement + board->xsize - 1) % board->xsize; break; case KEY_DOWN: case 'k': + yelement = (yelement + 1) % board->ysize; break; case KEY_RIGHT: case 'l': + xelement = (xelement + 1) % board->xsize; break; case KEY_ESC: case 'q': stop = 1; break; - case 's': + case 'r': + rotate = 1; break; - case ' ': - case 'v': - if (element) { - cleanboard (board); - rot = (rot + 1) % 4; - putelement (board, element, (xsize - element->xsize) / 2, (ysize - element->ysize) / 2, rot); - } + case 's': + /* save */ break; case KEY_BACKSPACE: case KEY_DELETE: case 127: case '\b': case 'x': + if (element) { + putelement (board, element, xelement, yelement, 0); + } + break; break; //case ERR: //default: -- 2.30.2