From: Laurent Mazet Date: Sat, 8 Jun 2024 18:49:43 +0000 (+0200) Subject: score evaluation is working X-Git-Tag: v1.0~35 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=b4f9d55e8f96836a441e0f66c918e484c237853f;p=scrabble.git score evaluation is working --- diff --git a/function.c b/function.c index 718b6f1..34efeac 100644 --- a/function.c +++ b/function.c @@ -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 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: */ diff --git a/function.h b/function.h index f9dd4bf..e252adc 100644 --- a/function.h +++ b/function.h @@ -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__ */ diff --git a/scrabble.c b/scrabble.c index d252adf..31da1f2 100644 --- a/scrabble.c +++ b/scrabble.c @@ -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 ();