Commit graph

284 commits

Author SHA1 Message Date
e56b3259e2 [board] Implement FromIterator for BitBoard 2024-01-17 08:48:46 -08:00
f337b8053d [board] Break getting the square the king is on into a separate helper method
Implement Position::king_square() and use it in is_king_in_check()
2024-01-17 08:48:23 -08:00
4fe9be036d [board] Reexport AlgebraicMoveFormatter from the move module 2024-01-17 08:47:48 -08:00
771081a5df [board] Derive Clone and Debug for MoveBuilder 2024-01-17 08:47:35 -08:00
e2f8faad3d [board] Implement Default for move::move_formatter::Style 2024-01-17 08:47:16 -08:00
71e93925b9 [board] Clean up a handful of things in position.rs
- Remove unused std::fmt::Write import
- Refer to the piece! macro with $crate (I didn't know this was legal??)
- Remove the doc comments on Position::flags
- Remove {set,clear}_player_has_right_to_castle_flag
- Remove an extraneous local variable from Position::place_piece()
2024-01-17 08:46:41 -08:00
ac5d8cc9d5 [board] Implement a move generator test for a single king 2024-01-17 08:44:51 -08:00
3ba6722697 [board] Implement a bunch of sight tests 2024-01-17 08:44:27 -08:00
2174bcf009 [board] Update all the move generator submodules to use MoveBuilder instead of Move
Along the way update "manual" piece creation to use the macros instead.
2024-01-17 08:43:48 -08:00
ca9ff94d2a [board] Rename the moves modules → move_generator
Update the imports.
Also update some references to crate symbols in move_generator macros to use $crate.
2024-01-17 08:40:09 -08:00
2d4ad70994 [board] Refer to Position with $crate in the position! macro 2024-01-17 08:36:00 -08:00
c8db5a430d [board] Fix a silly build error in position.rs
An extra closing brace.
2024-01-17 08:35:42 -08:00
f27d22d57f [board] Implement some TryInto traits for Square for u8, u16, u32, and u64 2024-01-17 08:35:21 -08:00
3a15fca10a [board] Remove the intermediate string in the Debug implementation for Position 2024-01-17 08:24:53 -08:00
177a4e32da [board] Implement a u16 based Move
Replace building a Move with the Move struct itself with a MoveBuilder that
builds a Move and returns it.

Update the tests and move formatter.
2024-01-16 18:03:27 -08:00
96b04379a4 [board] Implement Position::is_king_in_check()
Returns true if the king of the current player is in check.
2024-01-15 20:10:58 -08:00
81d544f0d5 [board] Rename BitBoard::has_piece_at → is_set 2024-01-15 17:42:27 -08:00
98fce9acde [board] Fix the shape_into_char test 2024-01-15 17:18:18 -08:00
e9607573c2 [board] Use absolute paths with $crate in the piece! macro 2024-01-15 17:17:57 -08:00
a6b98abb95 [board] Create a bitboard! macro and BitBoardBuilder
The Builder enables cleanly building a BitBoard out of squares.
The macro lets you create a BitBoard from a simple list of coordinates:

bitboard!(A1, B2, C3, D4, …)
2024-01-15 17:17:34 -08:00
9ef53b76f5 [board] Rename BitBoard::place_piece_at and BitBoard::remove_piece_at
→ set_square
→ clear_square
2024-01-15 17:16:14 -08:00
3ecc263701 [board] Implement piece sight algorithms
Add a new Sight trait, implemented by PlacedPiece. The implementation of this
trait produces a BitBoard representing the squares visible to the placed piece.
2024-01-15 16:03:06 -08:00
5961b1bcd5 [board] Export BitBoard directly off of the crate for internal use
Update all the imports to import from the crate directly.
2024-01-14 10:57:22 -08:00
ddea2c2d63 [board] Declare three new Display-like traits
- ASCIIDisplay → format a type using ASCII only characters
- UnicodeDisplay → format a type using any Unicode characters
- FENDisplay → format a type for inclusion in a FEN string
2024-01-14 10:51:40 -08:00
64b47a8d70 [board] Remove unused PlacedPiece::bitboard() 2024-01-14 10:27:04 -08:00
e56d256812 [board] Fix two build errors 2024-01-14 10:26:36 -08:00
284b3b68a0 [board] Add another test to the position flags 2024-01-14 10:19:20 -08:00
953c2f1522 [board] Move position flags to a Flags struct in its own module 2024-01-13 11:15:09 -08:00
7c80c61690 [board] Implement a position! macro for creating Positions
For example:

```
let position = position![
    White King on E4,
    Black Rook on E8,
];
```
2024-01-12 22:30:00 -08:00
94ab64d277 [board] Add a piece! macro
This macro implements a tiny DSL for creating Pieces and PlacedPieces.

"White King" → Piece::new(Color::White, Shape::King)
"White King on E4" → PlacedPiece::new(Piece::new(Color::White, Shape::King), Square::E4)
2024-01-12 22:26:13 -08:00
d2ee9244c2 [board] Update Position::player_has_right_to_castle callsites 2024-01-11 08:37:22 -08:00
094131822c [board] Implement move_formatter::AlgebraicMoveFormatter 2024-01-11 08:33:58 -08:00
caef0af244 [board] Implement Default for Position
Default returns an empty position.
2024-01-11 08:18:31 -08:00
0bc7e8d542 [board] Implement some castling checks on Move
Define some constants in Square that refer to the starting positions of the two
kings, and the target castling squares. Then implement the following methods that
use those constants to determine if a move is a castle.

- Move::is_kingside_castle()
- Move::is_queenside_castle()
- Move::is_castle()

These checks only apply to King moves, and if the king is moving from and to
specific squares.
2024-01-10 13:37:18 -08:00
31e5771d30 [board] Implement all the bit twiddling to track whether castling is allowed for each player and side of the board 2024-01-10 11:01:19 -08:00
8cc7e64ba6 [board] Fix a handful of linter warnings by allowing them
The linter also requires non-compliant formatting of the constants produced in
the coordinate_enum macro to be marked as allowed.
2024-01-06 20:51:23 -08:00
b62cd1fcd2 [board] Use Unicode chess characters to Display Pieces 2024-01-06 20:49:25 -08:00
ea8f5f47fd [board] A few miscellaneous clean ups in the moves module 2024-01-06 20:43:18 -08:00
e4a4477157 [board] Remove an unused BitBoard import from square.rs 2024-01-06 20:34:44 -08:00
626ac6245e [board] Copy the update_moves_with_ray macro into the rook move generator
This is an ugly copy/paste operation, but reduces the code in rook::ClassicalMoveGenerator somewhat.
2024-01-06 20:34:16 -08:00
edf7d1cd2f [board] Implement queen::ClassicalMoveGenerator
Implement a bishop move generator using the "classical" approach.
This approach walks each ray to find blockers and then masks out friendly pieces.
This is not efficient compared to other approaches, but it's much easier to implement.
2024-01-06 20:33:30 -08:00
c6e799f722 [board] Implement bishop::ClassicalMoveGenerator
Implement a bishop move generator using the "classical" approach.
This approach walks each ray to find blockers and then masks out friendly pieces.
This is not efficient compared to other approaches, but it's much easier to implement.
2024-01-06 20:06:54 -08:00
359bab9173 [board] Implement rook::ClassicalMoveGenerator
Implement a rook move generator using the "classical" approach.
This approach walks each ray to find blockers and then masks out friendly pieces.
This is not efficient compared to other approaches, but it's much easier to implement.
2024-01-06 19:51:06 -08:00
6e483b412b [board] Refactor ray BitBoard lookups
Rearrange the generated ray bitboards into a 2D grid by square and direction.
Use the Direction vector for lookup.
2024-01-06 19:47:55 -08:00
2394afc210 [board] Implement a TrailingBitScanner
This bit scanner iterates populated bits in a BitBoard from the trailing (least-significant) end.

Rename BitScanner → LeadingBitScanner.
Factor implementation of these two into a macro.
Clean up iterator returned by BitBoard::occupied_squares
Implement BitBoard::occupied_squares_trailing
2024-01-06 19:46:09 -08:00
e2d93b8c3c [board] Replace implementations of the king and knight move generators with a more generic version
While implementing these move generators, I realized I was duplicating a lot of code. So, I started thinking about how to do less of that. I create a MoveGeneratorInternal trait that these move generators implement. This trait provides default implementations of several methods.

I also discovered that I needed a way to keep track of move sets per piece for each kind (shape) of piece. The new move generators, and the generators still to come, can now keep track of moves per piece separately in MoveSet instances.
2024-01-06 17:01:16 -08:00
14db74f212 Remove tests module 2024-01-06 16:45:13 -08:00
3b266cb94a Update king move generator tests 2024-01-06 16:40:21 -08:00
216140bdbc Update knight move generator 2024-01-06 16:39:24 -08:00
46495ce581 Update Pawn move generator 2024-01-06 16:39:11 -08:00