Commit graph

23 commits

Author SHA1 Message Date
f005d94fc2 [bitboard, board, core, moves] Implement SliderMoveGenerator
This generator produces moves for slider pieces: bishops, rooks, and queens. All
of these pieces behave identically, though with different sets of rays that
emanate from the origin square. Claude helped me significantly with the
implementation and unit testing. All the unit tests that took advantage of Claude
for implementation are marked as such with an _ai_claude suffix to the test name.

One unique aspect of this move generator that Claude suggested to me was to use
loop { } instead of a recursive call to next() when the internal iterators expire.
I may try to port this to the other move generators in the future.

To support this move generator, implement a Slider enum in core that represents
one of the three slider pieces.

Add Board::bishops(), Board::rooks() and Board::queens() to return BitBoards of
those pieces. These are analogous to the pawns() and knights() methods that return
their corresponding pieces.

Also in the board create, replace the separate sight method implementations with
a macro. These are all the same, but with a different sight method called under
the hood.

Finally, derive Clone and Debug for the bit_scanner types.
2025-05-26 17:41:43 -07:00
faca844733 [moves] Knight move generator and tests 2025-05-25 11:05:10 -07:00
1da08df430 [board] Implement a couple handy piece getters
Board::find_pieces returns a BitBoard for all the pieces matching the given Piece.

Board::enemies returns a BitBoard of all the enemy pieces of a given Color.

Board::pawns returns a BitBoard of all the pawns of a given Color.
2025-05-23 18:39:18 -07:00
994f17091b [board] Implement Board::unwrap_color
Unwrap an Option<Color> using the board's active color in the default case.
2025-05-23 18:37:13 -07:00
5c5d9d5018 [board] Remove some dead code from Board 2025-05-23 14:14:49 -07:00
ddd14e8999 [board] Define two new types for the Clock properties of Board
Helpful for other parts of the code.
2025-05-23 09:53:29 -07:00
0c1863acb9 [board, core, moves, position] Implement castling
Implement a new method on Position that evaluates whether the active color can castle
on a given wing of the board. Then, implement making a castling move in the position.

Make a new Wing enum in the core crate to specify kingside or queenside. Replace the
Castle enum from the board crate with this one. This caused a lot of churn...

Along the way fix a bunch of tests.

Note: there's still no way to actually make a castling move in explorer.
2025-05-19 16:50:30 -07:00
3b5b2f16a3 [board] Add occupancy methods that return BitBoards 2025-05-16 07:47:28 -07:00
091cc99cb3 WIP 2025-05-08 17:37:51 -07:00
867deafd13 [board] A ton of API refinements 2025-05-03 16:02:56 -07:00
b0c4039920 [board] Remove Board::new() 2025-05-02 15:42:06 -07:00
bb8d5a6aa3 [board] Replace Flags with castle::Rights 2025-05-02 15:41:45 -07:00
cd60a453aa [board] Replace active player and move properties on Board with MoveCounter instance 2025-05-02 15:18:37 -07:00
30188d478e [board] Convert &BitBoard to BitBoard for several Board methods
I don't think passing by reference buys much for BitBoard. So simplify the
logic and borrowing semantics to make these easier to work with.
2024-07-13 12:03:19 -07:00
7ec72035ae [board] Remove en passant test helper method 2024-07-13 12:01:01 -07:00
d221de700d [board] Copy edit and add new documentation to Board 2024-07-13 12:00:02 -07:00
c297e4cbfa [board] Replace implementation of Board::piece_on_square with a simpler one
Now that board has a Mailbox, the implementation of this routine can be greatly
simplified. Instead of needing to iterate through all BitBoards to find the
occupied square, just consult the mailbox.
2024-07-13 11:57:57 -07:00
3785502ea0 [board] Declare Board::flags() pub(crate) instead of pub 2024-07-13 11:56:31 -07:00
26ae79e17d [board] Remove explicit #[inline] from several Board methods
Trust the compiler to inline where appropriate, until I know otherwise.
2024-07-13 11:54:58 -07:00
da4e2f1d50 [core] Use Color::default() instead of Color::White in Board::default() 2024-07-13 11:52:25 -07:00
90e33d1202 [board] Replace Pieces iterator with Mailbox::iter()
Mailbox can use a standard iterator because it's just a slice. So nice!
2024-07-13 11:52:02 -07:00
51de32fa0a [board] Update reference to PieceBitBoard → PieceSet
This isn't all of them...
2024-07-13 11:50:38 -07:00
1d82d27f84 Move a whole bunch of stuff to the new chessfriend_board package 2024-04-25 13:28:24 -07:00