PS: with regard to implementing MVV-LVA sorting/move picking, this is my current implementation:
Code: Select all
// Move sorting routines.
use super::Search;
use crate::{defs::NrOf, movegen::defs::MoveList};
// MVV_VLA[victim][attacker]
pub const MVV_LVA: [[u8; NrOf::PIECE_TYPES + 1]; NrOf::PIECE_TYPES + 1] = [
[0, 0, 0, 0, 0, 0, 0], // victim K, attacker K, Q, R, B, N, P, None
[50, 51, 52, 53, 54, 55, 0], // victim Q, attacker K, Q, R, B, N, P, None
[40, 41, 42, 43, 44, 45, 0], // victim R, attacker K, Q, R, B, N, P, None
[30, 31, 32, 33, 34, 35, 0], // victim B, attacker K, Q, R, B, N, P, None
[20, 21, 22, 23, 24, 25, 0], // victim K, attacker K, Q, R, B, N, P, None
[10, 11, 12, 13, 14, 15, 0], // victim P, attacker K, Q, R, B, N, P, None
[0, 0, 0, 0, 0, 0, 0], // victim None, attacker K, Q, R, B, N, P, None
];
impl Search {
pub fn score_moves(ml: &mut MoveList) {
for i in 0..ml.len() {
let m = ml.get_mut_move(i);
let value = MVV_LVA[m.captured()][m.piece()];
m.add_score(value);
}
}
pub fn pick_move(ml: &mut MoveList, index: u8) {
for i in (index + 1)..ml.len() {
if ml.get_move(i).score() > ml.get_move(index).score() {
ml.swap(i as usize, index as usize);
}
}
}
}
And that's everything there is.