correct bag management
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 10 Jun 2024 09:27:27 +0000 (11:27 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 10 Jun 2024 09:27:27 +0000 (11:27 +0200)
function.c
function.h
scrabble.c

index fcceb103ee1ab585716f4d418b3e0a1e6b948769..267f0133677c5ea68002bef522706c2f686998f3 100644 (file)
@@ -18,16 +18,6 @@ int contains (char *list, char *str)
     return 0;
 }
 
-int strcount (char *str, char ch)
-{
-    int n = 0;
-    while ((str = strchr (str, ch)) != NULL) {
-        str++;
-        n++;
-    }
-    return n;
-}
-
 int strmaxlen (char *str, char ch)
 {
     int len = 0;
@@ -96,6 +86,7 @@ void removeletter (play_t *play, int x, int y)
 }
 
 char gessletter (play_t *play, int x, int y)
+
 {
     return play->tab[x + play->xsize * y];
 }
@@ -123,17 +114,22 @@ void freedraw (draw_t *draw)
     free (draw);
 }
 
-draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game)
+draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game, int mode)
 {
     draw_t *ret = (game == NULL) ? newdraw (nbtiles) : game;
     int i;
-    for (i = 0; i < ret->nbtiles; i++) {
-        if (ret->tiles[i] != '\0') {
-            draw->tiles[draw->nbtiles++] = ret->tiles[i];
-            ret->tiles[i] = '\0';
+    if (mode) {
+        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 < ret->nbtiles) && (i < draw->nbtiles); i++) {
+    for (i = 0; (i < ret->nbtiles) && (draw->nbtiles > 0); i++) {
+        if (ret->tiles[i] != '\0') {
+            continue;
+        }
         int j = rand () % draw->nbtiles;
         ret->tiles[i] = draw->tiles[j];
         if (j < draw->nbtiles - 1) {
@@ -143,7 +139,6 @@ draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game)
         draw->nbtiles--;
         draw->tiles[draw->nbtiles] = '\0';
     }
-    ret->nbtiles = i;
     ret->index = -1;
     return ret;
 }
@@ -323,4 +318,17 @@ int evalscore (play_t *play, play_t *turn, board_t *board, bag_t *bag)
     return (score > 0) ? score : intern;
 }
 
+int isturnempty (play_t *turn)
+{
+    int ret = 1;
+    int i;
+    for (i = 0; i < turn->xsize * turn->ysize; i++) {
+        if (turn->tab[i] != ' ') {
+            ret = 0;
+            break;
+        }
+    }
+    return ret;
+}
+
 /* vim: set ts=4 sw=4 et: */
index e252adcc9e9583ed9579f5d5a6ce9167f303c584..67ca4fb38d7151a6fe8559e8e1eaa3358ecf3947 100644 (file)
@@ -5,8 +5,6 @@
 
 int contains (char *list, char *str);
 
-int strcount (char *str, char ch);
-
 int strmaxlen (char *str, char ch);
 
 play_t *initplay (int xsize, int ysize);
@@ -27,7 +25,7 @@ void freedraw (draw_t *draw);
 
 void cleanplay (play_t *play);
 
-draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game);
+draw_t *retrievetiles (draw_t *draw, int nbtiles, draw_t *game, int mode);
 
 void freedraw (draw_t *draw);
 
@@ -41,6 +39,8 @@ void moveletter (draw_t *game, int move);
 
 int evalscore (play_t *play, play_t *turn, board_t *board, bag_t *bag);
 
+int isturnempty (play_t *turn);
+
 #endif /* __FUNCTION_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index ffa01be29b7da65792bd5e3b911e06197227ba40..6dcaed5acafa24dcbe6d03dbba74a9bd91ea009d 100644 (file)
@@ -145,7 +145,7 @@ int main (int argc, char *argv[])
     draw_t *draw = initdraw (bag);
     draw_t **game = (draw_t **) calloc (nbplayers, sizeof (draw_t *));
     for (n = 0; n < nbplayers; n++) {
-        game[n] = retrievetiles (draw, board->length, NULL);
+        game[n] = retrievetiles (draw, board->length, NULL, 0);
     }
     VERBOSE (DEBUG, printf ("bag: 0x%p\ndraw: 0x%p\ngame: 0x%p\ngame[0]: 0x%p", bag, draw, game, game[0]));
 
@@ -196,7 +196,7 @@ int main (int argc, char *argv[])
     int stop = 0;
     while (!stop) {
         char highlight = current = gessletter (play, x, y);
-        if (current == ' ') {
+        if ((current == ' ') && (letter != '\0')) {
             highlight = letter;
         }
         showletter (highlight, x + xoffset, y + yoffset, 1);
@@ -213,7 +213,7 @@ int main (int argc, char *argv[])
         case '\n':
         case '\r':
         case 'd':
-            game[n] = retrievetiles (draw, board->length, game[n]);
+            game[n] = retrievetiles (draw, board->length, game[n], isturnempty (turn[n]));
             score[n] += nbpoints;
             drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 0);
             cleanplay (turn[n]);