use crate::bitboard::BitBoard;
use crate::game::pieces::{Color, FILES, RANKS};
use crate::game::position::Position;
use crate::game::Board;
const KING_MOVES: [BitBoard; 64] = compile_king_moves();
pub fn get_king_steps(board: &Board, color: Color, origin: Position) -> BitBoard {
let side = board.get_side(color);
let own_pieces = &side.pieces;
let grid = &KING_MOVES[origin.to_int() as usize];
grid & !own_pieces
}
const fn compile_king_moves() -> [BitBoard; 64] {
let mut moves: [BitBoard; 64] = [BitBoard(0); 64];
let mut i = 0usize;
loop {
let file = i % 8_usize;
let rank = i / 8_usize;
let center = 1u64 << i;
let mut files = FILES[file];
let mut ranks = RANKS[rank];
if file != 0 {
files = BitBoard(files.0 | FILES[file - 1].0);
}
if file != 7 {
files = BitBoard(files.0 | FILES[file + 1].0);
}
if rank != 0 {
ranks = BitBoard(ranks.0 | RANKS[rank - 1].0);
}
if rank != 7 {
ranks = BitBoard(ranks.0 | RANKS[rank + 1].0);
}
moves[i] = BitBoard(files.0 & ranks.0 & !center);
i += 1;
if i == 64 {
break;
}
}
moves
}
#[cfg(test)]
mod tests {
use crate::game::pieces::Color;
use crate::game::position::Position;
use crate::game::Board;
#[test]
fn test_generate_king_moves() {
let board =
Board::from_fen("rnbqk2r/4Pppp/5bn1/4p3/8/p3P3/P1Q2PPP/RNB1KBNR b KQkq - 0 1").unwrap();
let king = board.black.king.to_position();
let moves = super::get_king_steps(&board, Color::Black, king);
assert_eq!(
moves.collect::<Vec<Position>>(),
vec![
Position::from("d7"),
Position::from("e7"),
Position::from("f8"),
]
)
}
}