- // Choose a book move among the possible moves for the given position
- for (int idx = find_key(key); idx < bookSize; idx++)
- {
- read_entry(entry, idx);
- if (entry.key != key)
- break;
-
- unsigned score = entry.count;
-
- // If findBestMove is true choose highest rated book move
- if (findBestMove)
- {
- if (score > bestScore)
- {
- bestScore = score;
- bookMove = entry.move;
- }
- continue;
- }
-
- // Choose book move according to its score. If a move has a very
- // high score it has more probability to be choosen then a one with
- // lower score. Note that first entry is always chosen.
- scoresSum += score;
- if (RKiss.rand<unsigned>() % scoresSum < score)
- bookMove = entry.move;
- }
- if (!bookMove)
- return MOVE_NONE;
-
- // Verify the book move is legal
- MoveStack mlist[MOVES_MAX];
- MoveStack* last = generate_moves(pos, mlist);
- for (MoveStack* cur = mlist; cur != last; cur++)
- if ((int(cur->move) & 07777) == bookMove)
- return cur->move;
-
- return MOVE_NONE;