score evaluation is working
authorLaurent Mazet <mazet@softndesign.org>
Sat, 8 Jun 2024 18:49:43 +0000 (20:49 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 8 Jun 2024 18:49:43 +0000 (20:49 +0200)
function.c
function.h
scrabble.c

index 718b6f107d102d14d6e164d11d17149f5900c690..34efeacdfc4f63ba6ec7bea67194e7950df344da 100644 (file)
@@ -65,11 +65,16 @@ void cleanplay (play_t *play)
     memset (play->tab, ' ', play->xsize * play->ysize);
 }
 
+char *_getletteraddr (play_t *play, int x, int y)
+{
+    return play->tab + x + y * play->xsize;
+}
+
 int putletter (play_t *play, char letter, int x, int y)
 {
-    int ret = (letter != '\0') && (play->tab[x + play->xsize * y] == ' ');
+    int ret = (letter != '\0') && (*_getletteraddr (play, x, y) == ' ');
     if (ret) {
-        play->tab[x + play->xsize * y] = letter;
+        *_getletteraddr (play, x, y) = letter;
     }
     return ret;
 }
@@ -185,46 +190,139 @@ void moveletter (draw_t *game, int move)
     game->index = index;
 }
 
-int evalscore (play_t *play, play_t *turn, bag_t *bag)
+int _wordfactor (board_t *board, play_t *turn, int i, int j)
+{
+    int factor = 1;
+    if (*_getletteraddr (turn, i, j) != ' ') {
+        char pos[13] = {0};
+        sprintf (pos, "%c%d", 'A' + j, 1 + i);
+        if (contains (board->TW, pos)) {
+            factor = 3;
+        } else if (contains (board->DW, pos)) {
+            factor = 2;
+        } else if (contains (board->CS, pos)) {
+            factor = 2;
+        }
+    }
+    return factor;
+}
+
+int _letterfactor (board_t *board, play_t *turn, int i, int j)
+{
+    int factor = 1;
+    if (*_getletteraddr (turn, i, j) != ' ') {
+        char pos[13] = {0};
+        sprintf (pos, "%c%d", 'A' + j, 1 + i);
+        if (contains (board->TL, pos)) {
+            factor = 3;
+        } else if (contains (board->DL, pos)) {
+            factor = 2;
+        }
+    }
+    return factor;
+}
+
+int _findvalue (bag_t *bag, char letter)
 {
+    int value = 0;
+    int k;
+    for (k = 0; k < bag->nbletters; k++) {
+        if (bag->lettervalues[k].letter == letter) {
+            value = bag->lettervalues[k].value;
+            break;
+        }
+    }
+    return value;
+}
+
+int evalscore (play_t *play, play_t *turn, board_t *board, bag_t *bag)
+{
+    int intern = 0;
     int score = 0;
 
     int i, j;
-    int accountable = 0;
 
     /* words in line */
     for (j = 0; j < play->ysize; j++) {
         int s = 0;
+        int accountable = 0;
         int wfactor = 1;
+        int nbletters = 0;
         for (i = 0; i < play->xsize; i++) {
-            char letter = play->tab[i + j * play->xsize];
+
+            char letter = *_getletteraddr (play, i, j);
             if (letter == ' ') {
                 if (accountable) {
-                    score += s * wfactor;
+                    intern = s * wfactor;
+                    if (nbletters > 1) {
+                        score += intern;
+                        if (nbletters >= board->length) {
+                            score += board->premium;
+                        }
+                    }
                 }
                 s = 0;
                 accountable = 0;
                 wfactor = 1;
+                nbletters = 0;
             } else {
-                int lfactor = 1;
+                s += _findvalue (bag, letter) * _letterfactor (board, turn, i, j);
+                if (*_getletteraddr (turn, i, j) != ' ') {
+                    accountable = 1;
+                }
+                wfactor *=  _wordfactor (board, turn, i, j);
+                nbletters++;
+            }
+        }
+        if (accountable) {
+            intern = s * wfactor;
+            if (nbletters > 1) {
+                score += intern;
+                if (nbletters >= board->length) {
+                    score += board->premium;
+                }
+            }
+        }
+    }
+
+    /* words in column */
+    for (i = 0; i < play->xsize; i++) {
+        int s = 0;
+        int accountable = 0;
+        int wfactor = 1;
+        int nbletters = 0;
+        for (j = 0; j < play->ysize; j++) {
 
-                int k;
-                for (k = 0; k <bag->nbletters; k++) {
-                    if (bag->lettervalues[k].letter == letter) {
-                        score += bag->lettervalues[k].value * lfactor;
-                        break;
+            char letter = *_getletteraddr (play, i, j);
+            if (letter == ' ') {
+                if ((accountable) && (nbletters > 1)) {
+                    score += s * wfactor;
+                    if (nbletters >= board->length) {
+                        score += board->premium;
                     }
                 }
-                if (turn->tab[i + j * turn->xsize] != ' ') {
+                s = 0;
+                accountable = 0;
+                wfactor = 1;
+                nbletters = 0;
+            } else {
+                s += _findvalue (bag, letter) * _letterfactor (board, turn, i, j);
+                if (*_getletteraddr (turn, i, j) != ' ') {
                     accountable = 1;
                 }
+                wfactor *=  _wordfactor (board, turn, i, j);
+                nbletters++;
+            }
+        }
+        if ((accountable) && (nbletters > 1)) {
+            score += s * wfactor;
+            if (nbletters >= board->length) {
+                score += board->premium;
             }
         }
     }
 
-    /* words in column */
-
-    return score;
+    return (score > 0) ? score : intern;
 }
 
 /* vim: set ts=4 sw=4 et: */
index f9dd4bf8a0e3dd7d6fdb088ccb0759107332929c..e252adcc9e9583ed9579f5d5a6ce9167f303c584 100644 (file)
@@ -39,7 +39,7 @@ int returnletter (draw_t *game, char letter);
 
 void moveletter (draw_t *game, int move);
 
-int evalscore (play_t *play, play_t *turn, bag_t *bag);
+int evalscore (play_t *play, play_t *turn, board_t *board, bag_t *bag);
 
 #endif /* __FUNCTION_H__ */
 
index d252adfa4344d928049e42c43e813f2cb058381d..31da1f2b7d90320b63aa490a455e5b7bd27d0c19 100644 (file)
@@ -187,8 +187,6 @@ int main (int argc, char *argv[])
             cleanplay (turn);
             letter = getnextletter (game);
             drawwindow (game, xdrawwin, ydrawwin);
-            score = 0;
-            cleanplay (turn);
             break;
         case KEY_UP:
         case 'i':
@@ -258,7 +256,7 @@ int main (int argc, char *argv[])
         default:
         }
         showboard (play, board, xoffset, yoffset, mode);
-        score = evalscore (play, turn, bag);
+        score = evalscore (play, turn, board, bag);
     }
 
     endwin ();