better tile managment
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 29 May 2024 14:49:50 +0000 (16:49 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 29 May 2024 14:49:50 +0000 (16:49 +0200)
board.c
board.h
display.c
display.h
scrabble.c
type.h

diff --git a/board.c b/board.c
index a4e09f7bcac342344b5d9a552f5cb226f84cfa5d..a487b4248374bdc0934f10458ef945e98ff17f60 100644 (file)
--- a/board.c
+++ b/board.c
@@ -56,10 +56,13 @@ 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 < ret->nbtiles; i++) {
+        if (ret->tiles[i] != '\0') {
+            draw->tiles[draw->nbtiles++] = ret->tiles[i];
+            ret->tiles[i] = '\0';
+        }
     }
-    for (i = 0; (i < nbtiles) && (draw->nbtiles > 0); i++) {
+    for (i = 0; (i < ret->nbtiles) && (i < draw->nbtiles); i++) {
         int j = rand () % draw->nbtiles;
         ret->tiles[i] = draw->tiles[j];
         if (j < draw->nbtiles - 1) {
@@ -67,9 +70,10 @@ draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game)
             memmove(pt + j, pt + j + 1, draw->nbtiles - j - 1);
         }
         draw->nbtiles--;
-        draw->tiles[draw->nbtiles] = 0;
+        draw->tiles[draw->nbtiles] = '\0';
     }
     ret->nbtiles = i;
+    ret->index = -1;
     return ret;
 }
 
@@ -79,14 +83,26 @@ void freedraw (draw_t *draw)
     free (draw);
 }
 
-char getletter (draw_t *game)
+char getnextletter (draw_t *game)
 {
     char letter = 0;
-    if (game->nbtiles > 0) {
-        letter = game->tiles[game->nbtiles - 1];
-        game->nbtiles--;
+    int i;
+    for (i = 0; i < game->nbtiles; i++) {
+        game->index = (game->index + 1) % game->nbtiles;
+        if (game->tiles[game->index] != '\0') {
+            letter = game->tiles[game->index];
+            break;
+        }
     }
     return letter;
 }
 
+char getnewletter (draw_t *game)
+{
+    if (game->index != -1) {
+        game->tiles[game->index] = '\0';
+    }
+    return getnextletter (game);
+}
+
 /* vim: set ts=4 sw=4 et: */
diff --git a/board.h b/board.h
index 8887a6ab59a5d59aaeb35f3739338ca589d2c1bc..fb2ae6257386e4ff10ab8da08957f6031a734947 100644 (file)
--- a/board.h
+++ b/board.h
@@ -17,7 +17,9 @@ draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game);
 
 void freedraw (draw_t *draw);
 
-char getletter (draw_t *game);
+char getnextletter (draw_t *game);
+
+char getnewletter (draw_t *game);
 
 #endif /* __BOARD_H__ */
 
index d2f7b32a184f7281a631d2352bbe1986d905287f..2b57b1cfdc0d574f5511266d08bfdf7e11251b6d 100644 (file)
--- a/display.c
+++ b/display.c
@@ -154,7 +154,7 @@ void valuewindow (bag_t *bag, int xoffset, int yoffset, int length)
     }
 }
 
-void drawwindow (draw_t *bag, int xoffset, int yoffset, int length)
+void drawwindow (draw_t *game, int xoffset, int yoffset, int length)
 {
     int i;
     for (i = 0; i < 2 * length - 1; i++) {
@@ -169,9 +169,14 @@ void drawwindow (draw_t *bag, int xoffset, int yoffset, int length)
     mvaddch (yoffset, xoffset + 2 * length - 1, ACS_VLINE);
     mvaddch (yoffset + 1, xoffset + 2 * length - 1, ACS_LRCORNER);
 
+    mvaddch (yoffset - 1, xoffset + 2 * game->index , ACS_TTEE);
+    mvaddch (yoffset + 1, xoffset + 2 * game->index , ACS_BTEE);
+
     set_color (black);
-    for (i = 0; i < bag->nbtiles; i++) {
-        mvaddch (yoffset, xoffset + 2 * i, bag->tiles[i]);
+    for (i = 0; i < game->nbtiles; i++) {
+        if (game->tiles[i] != '\0') {
+            mvaddch (yoffset, xoffset + 2 * i, game->tiles[i]);
+        }
     }
     set_color (white);
 }
index 71560e1e1c56217642559de7bd864e2d40b482c7..1c5406a5975fe39c7d39ca6486628c87bdf943ed 100644 (file)
--- a/display.h
+++ b/display.h
@@ -13,7 +13,7 @@ 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);
+void drawwindow (draw_t *game, int xoffset, int yoffset, int length);
 
 #endif /* __DISPLAY_H__ */
 
index 527dbc493dc93fb5b98500cb1c336adfb3655aec..6eaa1411dd275da429f04a46ae193c9921096aba 100644 (file)
@@ -7,6 +7,7 @@
 #include <curses.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <time.h>
 
 #include "board.h"
 #include "constant.h"
@@ -105,6 +106,8 @@ int main (int argc, char *argv[])
         return 1;
     }
 
+    srand (time (NULL));
+
     play_t *play = initplay (board->xsize, board->ysize);
     VERBOSE (DEBUG, printf ("play: 0x%p\nboard: 0x%p\n", play, board));
 
@@ -112,13 +115,11 @@ int main (int argc, char *argv[])
     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);
-
-    noecho();
-    cbreak();
-    nonl();
+    initscr ();
+    noecho ();
+    cbreak ();
+    nonl ();
+    keypad (stdscr, TRUE);
     curs_set (0);
 
     start_color ();
@@ -132,8 +133,8 @@ int main (int argc, char *argv[])
     int x = (play->xsize + 1)/ 2 - 1;
     int y = (play->ysize + 1)/ 2 - 1;
 
+    char letter = getnextletter (game);
     drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length);
-    char letter = getletter (game);
     int stop = 0;
     while (!stop) {
         showletter (letter, x + xoffset, y + yoffset);
@@ -144,8 +145,8 @@ int main (int argc, char *argv[])
             break;
         case 'd':
             game = retrievetiles (draw, board->length, game);
+            letter = getnextletter (game);
             drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length);
-            letter = getletter (game);
             break;
         case KEY_UP:
         case 'i':
@@ -171,10 +172,14 @@ int main (int argc, char *argv[])
                 x++;
             }
             break;
+        case 'm':
+            letter = getnextletter (game);
+            drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length);
+            break;
         case 'p':
             if (putletter (play, letter, x, y)) {
+                letter = getnewletter (game);
                 drawwindow (game, xoffset, 2 * yoffset + board->ysize, board->length);
-                letter = getletter (game);
             }
             break;
         case 'q':
diff --git a/type.h b/type.h
index dc0802f7fb2d4c61bad925a17d852681d2a82262..af66756e2119890654156cc5fddafff2182b7dd8 100644 (file)
--- a/type.h
+++ b/type.h
@@ -35,6 +35,7 @@ typedef struct {
 typedef struct {
     int nbtiles;
     char *tiles;
+    int index;
 } draw_t;
 
 #endif /* __TYPE_H__ */