first attend to do multi player game
authorLaurent Mazet <mazet@softndesign.org>
Sun, 9 Jun 2024 21:32:05 +0000 (23:32 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Sun, 9 Jun 2024 21:32:05 +0000 (23:32 +0200)
display.c
display.h
scrabble.c

index bb831536b541917885e2818effbb36ef70fea845..218ce78d6abab01413876eca74a0f68d5c584278 100644 (file)
--- 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)
index ae15e2336cc70179dfa8bffae6e86728ad2d4dad..ad9d86cbe0c58ec9729fc3839d54d59518941be6 100644 (file)
--- 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);
 
index e62c28162fbcab24e0d36608267f82eb10eab4bb..ffa01be29b7da65792bd5e3b911e06197227ba40 100644 (file)
@@ -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;