- if(bestMove != 0) {
- MoveStack moves[256];
- int n, j;
- n = generate_legal_moves(pos, moves);
- for(j = 0; j < n; j++)
- if((int(moves[j].move) & 07777) == bestMove)
- return moves[j].move;
- }
+/// Book::get_move() gets a book move for a given position. Returns
+/// MOVE_NONE if no book move is found. If findBestMove is true then
+/// return always the highest rated book move.
+
+Move Book::get_move(const Position& pos, bool findBestMove) {
+
+ if (!bookSize || !bookFile.is_open())
+ return MOVE_NONE;
+
+ BookEntry entry;
+ int bookMove = MOVE_NONE;
+ unsigned score, scoresSum = 0, bestScore = 0;
+ uint64_t key = book_key(pos);
+
+ // Choose a book move among the possible moves for the given position
+ for (int idx = first_entry(key); idx < bookSize; idx++)
+ {
+ entry = read_entry(idx);
+
+ if (entry.key != key)
+ break;
+
+ score = entry.count;
+
+ if (!findBestMove)
+ {
+ // Choose book move according to its score. If a move has a very
+ // high score it has higher probability to be choosen than a move
+ // with lower score. Note that first entry is always chosen.
+ scoresSum += score;
+ if (RKiss.rand<unsigned>() % scoresSum < score)
+ bookMove = entry.move;
+ }
+ else if (score > bestScore)
+ {
+ bestScore = score;
+ bookMove = entry.move;
+ }