manage draws
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 29 May 2024 10:26:32 +0000 (12:26 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 29 May 2024 13:18:13 +0000 (15:18 +0200)
board.c
board.h
constant.c
display.c
display.h
scrabble.c
type.h

diff --git a/board.c b/board.c
index bbd7c8408d85d2d82642a2b8cdc0837f39420440..a4e09f7bcac342344b5d9a552f5cb226f84cfa5d 100644 (file)
--- a/board.c
+++ b/board.c
@@ -30,11 +30,63 @@ play_t *initplay (int xsize, int ysize)
 
 int putletter (play_t *play, char letter, int x, int y)
 {
-    int ret = (play->tab[x + play->xsize * y] == ' ');
+    int ret = (letter != '\0') && (play->tab[x + play->xsize * y] == ' ');
     if (ret) {
         play->tab[x + play->xsize * y] = letter;
     }
     return ret;
 }
 
+draw_t *newdraw (int nbtiles)
+{
+    draw_t *draw = (draw_t *) malloc (sizeof (draw_t));
+    draw->tiles = (char *) calloc (1, nbtiles);
+    draw->nbtiles = nbtiles;
+    return draw;
+}
+
+draw_t *initdraw (bag_t *bag)
+{
+    draw_t *draw = newdraw (bag->nbtiles);
+    memcpy (draw->tiles, bag->tiles, bag->nbtiles);
+    return draw;
+}
+
+draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game)
+{
+    draw_t *ret = (game == NULL) ? newdraw (nbtiles) : game;
+    int i;
+    for (i = 0; (game != NULL) && (i < game->nbtiles); i++) {
+        draw->tiles[draw->nbtiles++] = game->tiles[i];
+    }
+    for (i = 0; (i < nbtiles) && (draw->nbtiles > 0); i++) {
+        int j = rand () % draw->nbtiles;
+        ret->tiles[i] = draw->tiles[j];
+        if (j < draw->nbtiles - 1) {
+            char *pt = draw->tiles;
+            memmove(pt + j, pt + j + 1, draw->nbtiles - j - 1);
+        }
+        draw->nbtiles--;
+        draw->tiles[draw->nbtiles] = 0;
+    }
+    ret->nbtiles = i;
+    return ret;
+}
+
+void freedraw (draw_t *draw)
+{
+    free (draw->tiles);
+    free (draw);
+}
+
+char getletter (draw_t *game)
+{
+    char letter = 0;
+    if (game->nbtiles > 0) {
+        letter = game->tiles[game->nbtiles - 1];
+        game->nbtiles--;
+    }
+    return letter;
+}
+
 /* vim: set ts=4 sw=4 et: */
diff --git a/board.h b/board.h
index d665ab28fb017a8bc00feaaa1628d2a0b309e9e5..8887a6ab59a5d59aaeb35f3739338ca589d2c1bc 100644 (file)
--- a/board.h
+++ b/board.h
@@ -9,6 +9,16 @@ play_t *initplay (int xsize, int ysize);
 
 int putletter (play_t *play, char letter, int x, int y);
 
+draw_t *newdraw (int nbtiles);
+
+draw_t *initdraw (bag_t *bag);
+
+draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game);
+
+void freedraw (draw_t *draw);
+
+char getletter (draw_t *game);
+
 #endif /* __BOARD_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index 82be83f054385d209e526960bf4acea99c9c270a..798be5a1957876f43f863d438c711c18d1c93cf8 100644 (file)
@@ -21,7 +21,7 @@ static board_t _board_15x15_7 =
 
 #define NB_TILES_FR 102
 static char _tiles_fr[NB_TILES_FR] = {
-    ' ', ' ',
+    '.', '.',
     'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
     'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
     'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I',
@@ -52,7 +52,7 @@ static char _tiles_fr[NB_TILES_FR] = {
 
 #define NB_LETTERVALUES_FR 27
 static lettervalue_t _lettervalues_fr[NB_LETTERVALUES_FR] = {
-    {' ', 0},
+    {'.', 0},
     {'E', 1},
     {'A', 1},
     {'I', 1},
index 53a4f220b9160052659afb78a3e2f7c75248d3d4..d2f7b32a184f7281a631d2352bbe1986d905287f 100644 (file)
--- a/display.c
+++ b/display.c
@@ -38,9 +38,9 @@ void set_color (color_t color)
 
 void showletter (char letter, int x, int y)
 {
-    set_color (black);
-    mvaddch(y, x, letter);
-    set_color (white);
+    if (letter != '\0') {
+        mvaddch(y, x, letter);
+    }
 }
 
 void showboard (play_t *play, board_t *board, int xoffset, int yoffset, int full)
@@ -91,6 +91,8 @@ void showboard (play_t *play, board_t *board, int xoffset, int yoffset, int full
                     if (!full) {
                         c = ' ';
                     }
+                } else {
+                    set_color (black);
                 }
             }
             VERBOSE (DEBUG, if ((c < 32) || (c > 255)) printf ("character: %c\n", c));
@@ -152,4 +154,26 @@ void valuewindow (bag_t *bag, int xoffset, int yoffset, int length)
     }
 }
 
+void drawwindow (draw_t *bag, int xoffset, int yoffset, int length)
+{
+    int i;
+    for (i = 0; i < 2 * length - 1; i++) {
+        mvaddch (yoffset - 1, xoffset + i, ACS_HLINE);
+        mvaddch (yoffset, xoffset + i, ' ');
+        mvaddch (yoffset + 1, xoffset + i, ACS_HLINE);
+    }
+    mvaddch (yoffset - 1, xoffset - 1, ACS_ULCORNER);
+    mvaddch (yoffset, xoffset - 1, ACS_VLINE);
+    mvaddch (yoffset + 1, xoffset - 1, ACS_LLCORNER);
+    mvaddch (yoffset - 1, xoffset + 2 * length - 1, ACS_URCORNER);
+    mvaddch (yoffset, xoffset + 2 * length - 1, ACS_VLINE);
+    mvaddch (yoffset + 1, xoffset + 2 * length - 1, ACS_LRCORNER);
+
+    set_color (black);
+    for (i = 0; i < bag->nbtiles; i++) {
+        mvaddch (yoffset, xoffset + 2 * i, bag->tiles[i]);
+    }
+    set_color (white);
+}
+
 /* vim: set ts=4 sw=4 et: */
index 26efc1053f7035ff845418c08ac93ddd55eab849..71560e1e1c56217642559de7bd864e2d40b482c7 100644 (file)
--- a/display.h
+++ b/display.h
@@ -13,6 +13,8 @@ void helpwindow (char *msg, int xoffset, int yoffset, int length);
 
 void valuewindow (bag_t *bag, int xoffset, int yoffset, int length);
 
+void drawwindow (draw_t *bag, int xoffset, int yoffset, int length);
+
 #endif /* __DISPLAY_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index 633cdf1ba00a1a8f4ab8af058cdaa535ca863478..527dbc493dc93fb5b98500cb1c336adfb3655aec 100644 (file)
@@ -25,7 +25,7 @@ char *language = "fr";
 int xoffset = 4;
 int yoffset = 3;
 
-char *help = "<d> Draw tile\n<i>, <j>, <k>, <l> Move tile\n<p> Put tile<q> Quit\n<t> Toggle case legend\n";
+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";
 
 int usage (int ret)
 {
@@ -108,6 +108,10 @@ int main (int argc, char *argv[])
     play_t *play = initplay (board->xsize, board->ysize);
     VERBOSE (DEBUG, printf ("play: 0x%p\nboard: 0x%p\n", play, board));
 
+    draw_t *draw = initdraw (bag);
+    draw_t *game = retrievetiles (draw, board->length, NULL);
+    VERBOSE (DEBUG, printf ("bag: 0x%p\ndraw: 0x%p\ngame: 0x%p\n", bag, draw, game));
+
     initscr();
     //seed = time((time_t *)0);
     //srand(seed);
@@ -128,7 +132,8 @@ int main (int argc, char *argv[])
     int x = (play->xsize + 1)/ 2 - 1;
     int y = (play->ysize + 1)/ 2 - 1;
 
-    char letter = 'A' + (rand () % 26);
+    drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length);
+    char letter = getletter (game);
     int stop = 0;
     while (!stop) {
         showletter (letter, x + xoffset, y + yoffset);
@@ -137,6 +142,11 @@ int main (int argc, char *argv[])
         case KEY_ESC:
         case ':':
             break;
+        case 'd':
+            game = retrievetiles (draw, board->length, game);
+            drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length);
+            letter = getletter (game);
+            break;
         case KEY_UP:
         case 'i':
             if (y > 0) {
@@ -161,17 +171,18 @@ int main (int argc, char *argv[])
                 x++;
             }
             break;
+        case 'p':
+            if (putletter (play, letter, x, y)) {
+                drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length);
+                letter = getletter (game);
+            }
+            break;
         case 'q':
             stop = 1;
             break;
         case 't':
             mode ^= 1;
             break;
-        case 's':
-            if (putletter (play, letter, x, y)) {
-                letter = 'A' + (rand () % 26);
-            }
-            break;
         case ERR:
         default:
         }
diff --git a/type.h b/type.h
index a12df414fdac3fab33fabd316647cc24210d7c1a..dc0802f7fb2d4c61bad925a17d852681d2a82262 100644 (file)
--- a/type.h
+++ b/type.h
@@ -32,6 +32,11 @@ typedef struct {
     char *tab;
 } play_t;
 
+typedef struct {
+    int nbtiles;
+    char *tiles;
+} draw_t;
+
 #endif /* __TYPE_H__ */
 
 /* vim: set ts=4 sw=4 et: */