From abef70dd0763d5125d4d71cd141e9a310f71e256 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Wed, 29 May 2024 12:26:32 +0200 Subject: [PATCH] manage draws --- board.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- board.h | 10 ++++++++++ constant.c | 4 ++-- display.c | 30 +++++++++++++++++++++++++++--- display.h | 2 ++ scrabble.c | 25 ++++++++++++++++++------- type.h | 5 +++++ 7 files changed, 117 insertions(+), 13 deletions(-) diff --git a/board.c b/board.c index bbd7c84..a4e09f7 100644 --- 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 d665ab2..8887a6a 100644 --- 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: */ diff --git a/constant.c b/constant.c index 82be83f..798be5a 100644 --- a/constant.c +++ b/constant.c @@ -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}, diff --git a/display.c b/display.c index 53a4f22..d2f7b32 100644 --- 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: */ diff --git a/display.h b/display.h index 26efc10..71560e1 100644 --- 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: */ diff --git a/scrabble.c b/scrabble.c index 633cdf1..527dbc4 100644 --- a/scrabble.c +++ b/scrabble.c @@ -25,7 +25,7 @@ char *language = "fr"; int xoffset = 4; int yoffset = 3; -char *help = " Draw tile\n, , , Move tile\n

Put tile Quit\n Toggle case legend\n"; +char *help = " Draw tile\n, , , Move tile\n Move tile\n

Put tile\n Quit\n 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 a12df41..dc0802f 100644 --- 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: */ -- 2.30.2