- // Use MVV/LVA ordering.
- for(int i = 0; i < numOfMoves; i++) {
- Move m = moves[i].move;
- if(move_promotion(m))
- moves[i].score = QueenValueMidgame;
- else
- moves[i].score =
- int(pos->midgame_value_of_piece_on(move_to(m))) -
- int(pos->midgame_value_of_piece_on(move_to(m))) / 64;
+
+ // Use MVV/LVA ordering
+ for (int i = 0; i < numOfMoves; i++)
+ {
+ Move m = moves[i].move;
+ if (move_promotion(m))
+ moves[i].score = QueenValueMidgame;
+ else
+ moves[i].score = int(pos.midgame_value_of_piece_on(move_to(m)))
+ -int(pos.type_of_piece_on(move_from(m)));
+ }
+}
+
+
+/// find_best_index() loops across the moves and returns index of
+/// the highest scored one. There is also a second version that
+/// lowers the priority of moves that attack the same square,
+/// so that if the best move that attack a square fails the next
+/// move picked attacks a different square if any, not the same one.
+
+int MovePicker::find_best_index() {
+
+ assert(movesPicked < numOfMoves);
+
+ int bestIndex = movesPicked, bestScore = moves[movesPicked].score;
+
+ for (int i = movesPicked + 1; i < numOfMoves; i++)
+ if (moves[i].score > bestScore)
+ {
+ bestIndex = i;
+ bestScore = moves[i].score;
+ }
+ return bestIndex;
+}
+
+int MovePicker::find_best_index(Bitboard* squares, int values[]) {
+
+ assert(movesPicked < numOfMoves);
+
+ int hs;
+ Move m;
+ Square to;
+ int bestScore = -10000000, bestIndex = -1;
+
+ for (int i = movesPicked; i < numOfMoves; i++)
+ {
+ m = moves[i].move;
+ to = move_to(m);
+
+ if (!bit_is_set(*squares, to))
+ {
+ // Init at first use
+ set_bit(squares, to);
+ values[to] = 0;
+ }
+
+ hs = moves[i].score - values[to];
+ if (hs > bestScore)
+ {
+ bestIndex = i;
+ bestScore = hs;
+ }