Add move generation for all pieces (minus castling) and tests
This commit is contained in:
43
src/board.rs
43
src/board.rs
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user