return tile to set
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 30 May 2024 12:50:04 +0000 (14:50 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 30 May 2024 12:50:43 +0000 (14:50 +0200)
alternative key setup

board.c
board.h
display.c
display.h
scrabble.c

diff --git a/board.c b/board.c
index a487b4248374bdc0934f10458ef945e98ff17f60..927106f3ee80e4209091bcd90f98a2a064416974 100644 (file)
--- 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 fb2ae6257386e4ff10ab8da08957f6031a734947..05f4456a9dae78fb491be1cc417dde314224027f 100644 (file)
--- 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: */
index 2b57b1cfdc0d574f5511266d08bfdf7e11251b6d..286c68e70cac6fa018333072c75ce10ec0840e2a 100644 (file)
--- 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);
     }
 }
 
index 1c5406a5975fe39c7d39ca6486628c87bdf943ed..6e817fb870380660334ad904f70d92eac3c15b0d 100644 (file)
--- 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);
 
index 6eaa1411dd275da429f04a46ae193c9921096aba..ddb49f768bb8c3bafd89cb4b34b5f7750b9ab22c 100644 (file)
@@ -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 = "<d> Draw tile\n<i>, <j>, <k>, <l> Move tile\n<m> Move tile\n<p> Put tile\n<q> Quit\n<t> Toggle case legend\n";
+char *help =
+    "<c> Move tile\n"
+    "<d> Draw tile\n"
+    "<i> Move up tile\n"
+    "<j> Move left tile\n"
+    "<k> Move down tile\n"
+    "<l> Move right tile\n"
+    "<q> Quit\n"
+    "<t> Toggle case legend\n"
+    "<v> Put tile\n"
+    "<x> 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: