From: Laurent Mazet Date: Sun, 9 Jun 2024 21:32:05 +0000 (+0200) Subject: first attend to do multi player game X-Git-Tag: v1.0~31 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=2592ad2d07b5204a1cafefcace8397e60555bb2b;p=scrabble.git first attend to do multi player game --- diff --git a/display.c b/display.c index bb83153..218ce78 100644 --- a/display.c +++ b/display.c @@ -180,9 +180,10 @@ void valuewindow (bag_t *bag, int xoffset, int yoffset, int length, char current } } -void drawwindow (draw_t *game, int xoffset, int yoffset) +void drawwindow (draw_t *game, int score, int xoffset, int yoffset, int mode) { int i; + for (i = 0; i < 2 * game->nbtiles - 1; i++) { mvaddch (yoffset - 1, xoffset + i, ACS_HLINE); mvaddch (yoffset, xoffset + i, ' '); @@ -195,8 +196,10 @@ void drawwindow (draw_t *game, int xoffset, int yoffset) mvaddch (yoffset, xoffset + 2 * game->nbtiles - 1, ACS_VLINE); mvaddch (yoffset + 1, xoffset + 2 * game->nbtiles - 1, ACS_LRCORNER); - mvaddch (yoffset - 1, xoffset + 2 * game->index , ACS_TTEE); - mvaddch (yoffset + 1, xoffset + 2 * game->index , ACS_BTEE); + if (mode) { + 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 < game->nbtiles; i++) { @@ -205,6 +208,10 @@ void drawwindow (draw_t *game, int xoffset, int yoffset) } } set_color (white); + + char str[11] = {0}; + sprintf (str, "%3d", score); + mvaddstr (yoffset + 2, xoffset + (game->nbtiles * 2 - 1) / 2 - 2, str); } void scorewindow (int score, int xoffset, int yoffset) diff --git a/display.h b/display.h index ae15e23..ad9d86c 100644 --- a/display.h +++ b/display.h @@ -13,7 +13,7 @@ int helpwindow (char *msg, char *msg2, int xoffset, int yoffset); void valuewindow (bag_t *bag, int xoffset, int yoffset, int length, char current); -void drawwindow (draw_t *game, int xoffset, int yoffset); +void drawwindow (draw_t *game, int score, int xoffset, int yoffset, int mode); void scorewindow (int score, int xoffset, int yoffset); diff --git a/scrabble.c b/scrabble.c index e62c281..ffa01be 100644 --- a/scrabble.c +++ b/scrabble.c @@ -62,6 +62,7 @@ int usage (int ret) /* main function */ int main (int argc, char *argv[]) { + int n; /* get basename */ char *pt = progname = argv[0]; @@ -142,10 +143,16 @@ int main (int argc, char *argv[]) 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)); + draw_t **game = (draw_t **) calloc (nbplayers, sizeof (draw_t *)); + for (n = 0; n < nbplayers; n++) { + game[n] = retrievetiles (draw, board->length, NULL); + } + VERBOSE (DEBUG, printf ("bag: 0x%p\ndraw: 0x%p\ngame: 0x%p\ngame[0]: 0x%p", bag, draw, game, game[0])); - play_t *turn = initplay (board->xsize, board->ysize); + play_t **turn = (play_t **) calloc (nbplayers, sizeof (play_t *)); + for (n = 0; n < nbplayers; n++) { + turn[n] = initplay (board->xsize, board->ysize); + } initscr (); noecho (); @@ -160,8 +167,12 @@ int main (int argc, char *argv[]) int yvaluewin = yoffset - 1; int xhelpwin = xvaluewin + xoffset + 10; int yhelpwin = yoffset - 1; - int xdrawwin = xoffset; - int ydrawwin = 2 * yoffset + max (board->ysize, 1 + (bag->nbletters + 1) /2); + int *xdrawwin = (int *) calloc (nbplayers, sizeof (int)); + int *ydrawwin = (int *) calloc (nbplayers, sizeof (int)); + for (n = 0; n < nbplayers; n++) { + xdrawwin[n] = (n + 1) * xoffset + n * (board->length * 2 - 1); + ydrawwin[n] = 2 * yoffset + max (board->ysize, 1 + (bag->nbletters + 1) /2); + } int helplen = helpwindow (help, getextrahelp (language), xhelpwin, yhelpwin); @@ -174,9 +185,14 @@ int main (int argc, char *argv[]) int x = (play->xsize + 1)/ 2 - 1; int y = (play->ysize + 1)/ 2 - 1; - char current, letter = getnextletter (game); - drawwindow (game, xdrawwin, ydrawwin); - int score = 0; + int *score = (int *) calloc (nbplayers, sizeof (int)); + for (n = 0; n < nbplayers; n++) { + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 0); + } + n = 0; + char current, letter = getnextletter (game[n]); + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 1); + int nbpoints = 0; int stop = 0; while (!stop) { char highlight = current = gessletter (play, x, y); @@ -185,22 +201,25 @@ int main (int argc, char *argv[]) } showletter (highlight, x + xoffset, y + yoffset, 1); valuewindow (bag, xvaluewin, yvaluewin, 10, highlight); - scorewindow (score, xscorewin, yscorewin); + scorewindow (nbpoints, xscorewin, yscorewin); switch (getch ()) { case '\t': case 'c': - letter = getnextletter (game); - drawwindow (game, xdrawwin, ydrawwin); + letter = getnextletter (game[n]); + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 1); break; case KEY_ENTER: case '\n': case '\r': case 'd': - game = retrievetiles (draw, board->length, game); - cleanplay (turn); - letter = getnextletter (game); - drawwindow (game, xdrawwin, ydrawwin); + game[n] = retrievetiles (draw, board->length, game[n]); + score[n] += nbpoints; + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 0); + cleanplay (turn[n]); + n = (n + 1) % nbplayers; + letter = getnextletter (game[n]); + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 1); break; case KEY_UP: case 'i': @@ -236,9 +255,9 @@ int main (int argc, char *argv[]) case ' ': case 'v': if (putletter (play, letter, x, y)) { - putletter (turn, letter, x, y); - letter = getnewletter (game); - drawwindow (game, xdrawwin, ydrawwin); + putletter (turn[n], letter, x, y); + letter = getnewletter (game[n]); + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 1); } break; case KEY_BACKSPACE: @@ -248,36 +267,43 @@ int main (int argc, char *argv[]) case 'x': current = gessletter (play, x, y); if (current != ' ') { - if (returnletter (game, current)) { + if (returnletter (game[n], current)) { removeletter (play, x, y); - removeletter (turn, x, y); - letter = getnextletter (game); - drawwindow (game, xdrawwin, ydrawwin); + removeletter (turn[n], x, y); + letter = getnextletter (game[n]); + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 1); } } break; case KEY_HOME: case 'J': - moveletter (game, -1); - drawwindow (game, xdrawwin, ydrawwin); + moveletter (game[n], -1); + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 1); break; case KEY_END: case 'L': - moveletter (game, +1); - drawwindow (game, xdrawwin, ydrawwin); + moveletter (game[n], +1); + drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 1); break; case ERR: default: } showboard (play, board, xoffset, yoffset, mode); - score = evalscore (play, turn, board, bag); + nbpoints = evalscore (play, turn[n], board, bag); } endwin (); freeplay (play); - freeplay (turn); - freedraw (game); + for (n = 0; n < nbplayers; n++) { + freeplay (turn[n]); + freedraw (game[n]); + } + free (turn); + free (game); + free (xdrawwin); + free (ydrawwin); + free (score); freedraw (draw); return 0;