Add move generation for all pieces (minus castling) and tests

This commit is contained in:
2024-06-09 15:21:45 +03:00
parent 2133fb3cad
commit 880df665d5
3 changed files with 461 additions and 5 deletions

View File

@@ -13,6 +13,10 @@ pub struct Board {
pub black_pieces: [Piece; 6],
pub state: State,
}
use crate::movegen::{
bishop_pseudo_moves, king_pseudo_moves, knight_pseudo_moves, pawn_pseudo_moves,
queen_pseudo_moves, rook_pseudo_moves, Move,
};
impl Board {
pub const fn new() -> Self {
@@ -96,6 +100,37 @@ impl Board {
|| enemy[Kind::Queen.idx()].bitboard & get_queen_attacks(all_occupancies, sq) != 0
|| enemy[Kind::King.idx()].bitboard & get_king_attacks(sq) != 0
}
pub fn pseudo_moves(&self, color: Color, kind: Kind) -> Vec<Move> {
let all_occupancies = self.get_all_occupancies();
let (pieces, enemy_occupancies, own_occupancies) = match color {
Color::White => (
self.white_pieces[kind.idx()].bitboard,
self.get_black_occupancies(),
self.get_white_occupancies(),
),
Color::Black => (
self.black_pieces[kind.idx()].bitboard,
self.get_white_occupancies(),
self.get_black_occupancies(),
),
};
match kind {
Kind::Pawn => pawn_pseudo_moves(
pieces,
all_occupancies,
enemy_occupancies,
self.state,
color,
),
Kind::Knight => knight_pseudo_moves(pieces, own_occupancies),
Kind::Bishop => bishop_pseudo_moves(pieces, all_occupancies, own_occupancies),
Kind::Rook => rook_pseudo_moves(pieces, all_occupancies, own_occupancies),
Kind::Queen => queen_pseudo_moves(pieces, all_occupancies, own_occupancies),
Kind::King => king_pseudo_moves(pieces, own_occupancies),
}
}
}
impl Default for Board {
@@ -167,12 +202,12 @@ pub enum Kind {
}
impl Kind {
fn idx(&self) -> usize {
pub const fn idx(&self) -> usize {
*self as usize
}
}
#[derive(Debug, PartialEq, Eq)]
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum Color {
White,
Black,
@@ -184,9 +219,7 @@ mod tests {
use super::*;
const FEN_EXAMPLE: [&str; 1] = [
"8/6P1/4n2b/1p6/1Kp5/6n1/4b3/1k6 w - - 0 1",
];
const FEN_EXAMPLE: [&str; 1] = ["8/6P1/4n2b/1p6/1Kp5/6n1/4b3/1k6 w - - 0 1"];
#[test]
fn test_get_all_occupancies() -> Result<(), String> {