From 29fdfaa5a6a1132d51299090500e2e85d525334c Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Thu, 30 May 2024 14:50:04 +0200 Subject: [PATCH] return tile to set alternative key setup --- board.c | 24 ++++++++++++++++++++++ board.h | 6 ++++++ display.c | 16 ++++++++++++++- display.h | 2 +- scrabble.c | 59 +++++++++++++++++++++++++++++++++++++++++------------- 5 files changed, 91 insertions(+), 16 deletions(-) diff --git a/board.c b/board.c index a487b42..927106f 100644 --- a/board.c +++ b/board.c @@ -37,6 +37,16 @@ int putletter (play_t *play, char letter, int x, int y) return ret; } +void removeletter (play_t *play, int x, int y) +{ + play->tab[x + play->xsize * y] = ' '; +} + +char gessletter (play_t *play, int x, int y) +{ + return play->tab[x + play->xsize * y]; +} + draw_t *newdraw (int nbtiles) { draw_t *draw = (draw_t *) malloc (sizeof (draw_t)); @@ -105,4 +115,18 @@ char getnewletter (draw_t *game) return getnextletter (game); } +int returnletter (draw_t *game, char letter) +{ + int i, ret = 0; + for (i = 0; i < game->nbtiles; i++) { + if (game->tiles[i] == '\0') { + game->tiles[i] = letter; + game->index = i - 1; + ret = 1; + break; + } + } + return ret; +} + /* vim: set ts=4 sw=4 et: */ diff --git a/board.h b/board.h index fb2ae62..05f4456 100644 --- a/board.h +++ b/board.h @@ -9,6 +9,10 @@ play_t *initplay (int xsize, int ysize); int putletter (play_t *play, char letter, int x, int y); +void removeletter (play_t *play, int x, int y); + +char gessletter (play_t *play, int x, int y); + draw_t *newdraw (int nbtiles); draw_t *initdraw (bag_t *bag); @@ -21,6 +25,8 @@ char getnextletter (draw_t *game); char getnewletter (draw_t *game); +int returnletter (draw_t *game, char letter); + #endif /* __BOARD_H__ */ /* vim: set ts=4 sw=4 et: */ diff --git a/display.c b/display.c index 2b57b1c..286c68e 100644 --- a/display.c +++ b/display.c @@ -15,6 +15,12 @@ typedef enum { magenta, yellow, black, + wred, + wgreen, + wblue, + wcyan, + wmagenta, + wyellow, } color_t; void set_color (color_t color) @@ -30,16 +36,24 @@ void set_color (color_t color) init_pair (yellow, COLOR_BLACK, COLOR_YELLOW); init_pair (cyan, COLOR_BLACK, COLOR_CYAN); init_pair (black, COLOR_BLACK, COLOR_WHITE); + init_pair (wred, COLOR_WHITE, COLOR_RED); + init_pair (wgreen, COLOR_WHITE, COLOR_GREEN); + init_pair (wblue, COLOR_WHITE, COLOR_BLUE); + init_pair (wcyan, COLOR_WHITE, COLOR_CYAN); + init_pair (wmagenta, COLOR_WHITE, COLOR_MAGENTA); + init_pair (wyellow, COLOR_WHITE, COLOR_YELLOW); init = 0; } attrset (COLOR_PAIR(color)); } -void showletter (char letter, int x, int y) +void showletter (char letter, int x, int y, int mode) { if (letter != '\0') { + set_color (mode ? yellow: wyellow); mvaddch(y, x, letter); + set_color (white); } } diff --git a/display.h b/display.h index 1c5406a..6e817fb 100644 --- a/display.h +++ b/display.h @@ -5,7 +5,7 @@ int putletter (play_t *play, char letter, int x, int y); -void showletter (char letter, int x, int y); +void showletter (char letter, int x, int y, int mode); void showboard (play_t *play, board_t *board, int xoffset, int yoffset, int full); diff --git a/scrabble.c b/scrabble.c index 6eaa141..ddb49f7 100644 --- a/scrabble.c +++ b/scrabble.c @@ -15,6 +15,7 @@ #include "debug.h" #define KEY_ESC 0x1b +#define KEY_DELETE 0x014a /* static variables */ char *progname = NULL; @@ -26,7 +27,17 @@ char *language = "fr"; int xoffset = 4; int yoffset = 3; -char *help = " Draw tile\n, , , Move tile\n Move tile\n

Put tile\n Quit\n Toggle case legend\n"; +char *help = + " Move tile\n" + " Draw tile\n" + " Move up tile\n" + " Move left tile\n" + " Move down tile\n" + " Move right tile\n" + " Quit\n" + " Toggle case legend\n" + " Put tile\n" + " Retrieve tile\n"; int usage (int ret) { @@ -133,16 +144,24 @@ int main (int argc, char *argv[]) int x = (play->xsize + 1)/ 2 - 1; int y = (play->ysize + 1)/ 2 - 1; - char letter = getnextletter (game); + char current, letter = getnextletter (game); drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length); int stop = 0; while (!stop) { - showletter (letter, x + xoffset, y + yoffset); + current = gessletter (play, x, y); + if (current == ' ') { + showletter (letter, x + xoffset, y + yoffset, 1); + } else { + showletter (current, x + xoffset, y + yoffset, 0); + } switch (getch ()) { - case KEY_ESC: - case ':': + case '\t': + case 'c': + letter = getnextletter (game); + drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length); break; + case KEY_ENTER: case 'd': game = retrievetiles (draw, board->length, game); letter = getnextletter (game); @@ -172,21 +191,33 @@ int main (int argc, char *argv[]) x++; } break; - case 'm': - letter = getnextletter (game); - drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length); + case KEY_ESC: + case 'q': + stop = 1; break; - case 'p': + case 't': + mode ^= 1; + break; + case ' ': + case 'v': if (putletter (play, letter, x, y)) { letter = getnewletter (game); drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length); } break; - case 'q': - stop = 1; - break; - case 't': - mode ^= 1; + case KEY_BACKSPACE: + case KEY_DELETE: + case 127: + case '\b': + case 'x': + current = gessletter (play, x, y); + if (current != ' ') { + if (returnletter (game, current)) { + removeletter (play, x, y); + letter = getnextletter (game); + drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length); + } + } break; case ERR: default: -- 2.30.2