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: */
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: */
#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',
#define NB_LETTERVALUES_FR 27
static lettervalue_t _lettervalues_fr[NB_LETTERVALUES_FR] = {
- {' ', 0},
+ {'.', 0},
{'E', 1},
{'A', 1},
{'I', 1},
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)
if (!full) {
c = ' ';
}
+ } else {
+ set_color (black);
}
}
VERBOSE (DEBUG, if ((c < 32) || (c > 255)) printf ("character: %c\n", c));
}
}
+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: */
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: */
int xoffset = 4;
int yoffset = 3;
-char *help = "<d> Draw tile\n<i>, <j>, <k>, <l> Move tile\n<p> Put tile<q> Quit\n<t> Toggle case legend\n";
+char *help = "<d> Draw tile\n<i>, <j>, <k>, <l> Move tile\n<m> Move tile\n<p> Put tile\n<q> Quit\n<t> Toggle case legend\n";
int usage (int ret)
{
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);
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);
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) {
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:
}
char *tab;
} play_t;
+typedef struct {
+ int nbtiles;
+ char *tiles;
+} draw_t;
+
#endif /* __TYPE_H__ */
/* vim: set ts=4 sw=4 et: */