[bitboard] Add pawn attacks bitboards to the Library

This commit is contained in:
Eryn Wells 2024-01-28 09:08:57 -08:00
parent 164fe94bc0
commit 1f873879bb
2 changed files with 20 additions and 1 deletions

View file

@ -40,6 +40,10 @@ impl BitBoard {
library().ray(sq, dir) library().ray(sq, dir)
} }
pub fn pawn_attacks(sq: Square, color: Color) -> BitBoard {
library().pawn_attacks(sq, color)
}
moves_getter!(knight_moves); moves_getter!(knight_moves);
moves_getter!(bishop_moves); moves_getter!(bishop_moves);
moves_getter!(rook_moves); moves_getter!(rook_moves);

View file

@ -1,7 +1,7 @@
// Eryn Wells <eryn@erynwells.me> // Eryn Wells <eryn@erynwells.me>
use crate::BitBoard; use crate::BitBoard;
use chessfriend_core::{Direction, Square}; use chessfriend_core::{Color, Direction, Square};
use std::sync::Once; use std::sync::Once;
pub(super) const RANKS: [BitBoard; 8] = [ pub(super) const RANKS: [BitBoard; 8] = [
@ -57,6 +57,7 @@ pub(super) struct MoveLibrary {
rays: [[BitBoard; 8]; Square::NUM], rays: [[BitBoard; 8]; Square::NUM],
// Piecewise move tables // Piecewise move tables
pawn_attacks: [[BitBoard; 64]; 2],
knight_moves: [BitBoard; 64], knight_moves: [BitBoard; 64],
bishop_moves: [BitBoard; 64], bishop_moves: [BitBoard; 64],
rook_moves: [BitBoard; 64], rook_moves: [BitBoard; 64],
@ -68,6 +69,7 @@ impl MoveLibrary {
const fn new() -> MoveLibrary { const fn new() -> MoveLibrary {
MoveLibrary { MoveLibrary {
rays: [[BitBoard::empty(); 8]; Square::NUM], rays: [[BitBoard::empty(); 8]; Square::NUM],
pawn_attacks: [[BitBoard::empty(); 64]; 2],
knight_moves: [BitBoard::empty(); 64], knight_moves: [BitBoard::empty(); 64],
bishop_moves: [BitBoard::empty(); 64], bishop_moves: [BitBoard::empty(); 64],
rook_moves: [BitBoard::empty(); 64], rook_moves: [BitBoard::empty(); 64],
@ -78,6 +80,7 @@ impl MoveLibrary {
fn init(&mut self) { fn init(&mut self) {
for sq in Square::ALL { for sq in Square::ALL {
self.init_pawn_moves(sq);
self.init_orthogonal_rays(sq); self.init_orthogonal_rays(sq);
self.init_diagonal_rays(sq); self.init_diagonal_rays(sq);
self.init_knight_moves(sq as usize); self.init_knight_moves(sq as usize);
@ -164,6 +167,14 @@ impl MoveLibrary {
self.queen_moves[sq as usize] = rook_moves | bishop_moves; self.queen_moves[sq as usize] = rook_moves | bishop_moves;
} }
fn init_pawn_moves(&mut self, sq: Square) {
let bitboard: BitBoard = sq.into();
self.pawn_attacks[Color::White as usize][sq as usize] =
bitboard.shift_north_west_one() | bitboard.shift_north_east_one();
self.pawn_attacks[Color::Black as usize][sq as usize] =
bitboard.shift_south_west_one() | bitboard.shift_south_east_one();
}
#[inline] #[inline]
fn generate_ray(sq: BitBoard, shift: fn(&BitBoard) -> BitBoard) -> BitBoard { fn generate_ray(sq: BitBoard, shift: fn(&BitBoard) -> BitBoard) -> BitBoard {
let mut ray = BitBoard::empty(); let mut ray = BitBoard::empty();
@ -181,6 +192,10 @@ impl MoveLibrary {
self.rays[sq as usize][dir as usize] self.rays[sq as usize][dir as usize]
} }
pub(super) fn pawn_attacks(&self, sq: Square, color: Color) -> BitBoard {
self.pawn_attacks[color as usize][sq as usize]
}
library_getter!(knight_moves); library_getter!(knight_moves);
library_getter!(bishop_moves); library_getter!(bishop_moves);
library_getter!(rook_moves); library_getter!(rook_moves);