Spaces:
Runtime error
Runtime error
| // movepick.rs | |
| use crate::types::{Move, PieceType}; | |
| use crate::position::Position; | |
| // MVV-LVA [Victim][Attacker] | |
| const MVV_LVA: [[i32; 7]; 7] = [ | |
| [0; 7], | |
| [0, 105, 205, 305, 405, 505, 605], // Victim Pawn | |
| [0, 104, 204, 304, 404, 504, 604], // Victim Knight | |
| [0, 103, 203, 303, 403, 503, 603], // Victim Bishop | |
| [0, 102, 202, 302, 402, 502, 602], // Victim Rook | |
| [0, 101, 201, 301, 401, 501, 601], // Victim Queen | |
| [0, 100, 200, 300, 400, 500, 600], // Victim King | |
| ]; | |
| pub fn score_moves(pos: &Position, moves: &mut [(Move, i32)], tt_move: Move, killer1: Move, killer2: Move) { | |
| for (m, score) in moves.iter_mut() { | |
| if *m == tt_move { | |
| *score = 2000000; // Best move from Transposition Table | |
| continue; | |
| } | |
| let captured = pos.get_piece_at(m.to()); | |
| if captured != PieceType::None { | |
| let attacker = pos.get_piece_at(m.from()); | |
| *score = 1000000 + MVV_LVA[captured as usize][attacker as usize]; | |
| } else if *m == killer1 { | |
| *score = 900000; | |
| } else if *m == killer2 { | |
| *score = 800000; | |
| } else { | |
| if m.promotion() != PieceType::None { | |
| *score = 700000; // Promote to a piece | |
| } else { | |
| *score = 0; // Quiet moves will be ordered by history heuristic eventually | |
| } | |
| } | |
| } | |
| } | |
| pub fn pick_next_move(moves: &mut [(Move, i32)], start_idx: usize) -> Move { | |
| let mut best_idx = start_idx; | |
| let mut best_score = -1; | |
| for i in start_idx..moves.len() { | |
| if moves[i].1 > best_score { | |
| best_score = moves[i].1; | |
| best_idx = i; | |
| } | |
| } | |
| moves.swap(start_idx, best_idx); | |
| moves[start_idx].0 | |
| } | |