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;
}
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: */