From: Laurent MAZET Date: Wed, 29 May 2024 14:49:50 +0000 (+0200) Subject: better tile managment X-Git-Tag: v1.0~49 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=125accc1b0d6fca73c98d0fc49d001f7f1371786;p=scrabble.git better tile managment --- diff --git a/board.c b/board.c index a4e09f7..a487b42 100644 --- 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 8887a6a..fb2ae62 100644 --- 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__ */ diff --git a/display.c b/display.c index d2f7b32..2b57b1c 100644 --- 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); } diff --git a/display.h b/display.h index 71560e1..1c5406a 100644 --- 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__ */ diff --git a/scrabble.c b/scrabble.c index 527dbc4..6eaa141 100644 --- a/scrabble.c +++ b/scrabble.c @@ -7,6 +7,7 @@ #include #include #include +#include #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 dc0802f..af66756 100644 --- 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__ */