From 0ff868babb6b3a0d511cc6f329f495c2d3ab5c16 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Mon, 10 Jun 2024 11:27:27 +0200 Subject: [PATCH] correct bag management --- function.c | 42 +++++++++++++++++++++++++----------------- function.h | 6 +++--- scrabble.c | 6 +++--- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/function.c b/function.c index fcceb10..267f013 100644 --- a/function.c +++ b/function.c @@ -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: */ diff --git a/function.h b/function.h index e252adc..67ca4fb 100644 --- a/function.h +++ b/function.h @@ -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: */ diff --git a/scrabble.c b/scrabble.c index ffa01be..6dcaed5 100644 --- a/scrabble.c +++ b/scrabble.c @@ -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]); -- 2.30.2