Commit graph

180 commits

Author SHA1 Message Date
1ebe7d10de Move Notes and ChessPieces docs to a doc directory 2024-01-22 19:27:08 -08:00
90266f2dd0 [board] Make the MoveSet struct (and its internal structs) public for the crate 2024-01-22 08:20:38 -08:00
3244bfc211 [board] Make the fen module public so clients can access ToFen 2024-01-22 08:19:09 -08:00
c2a115cee9 [board] Implement Display for Color 2024-01-22 08:18:49 -08:00
7424236f1d [board] Add MakeMoveError::IllegalSquare(Square) 2024-01-22 08:18:37 -08:00
9a8380573b [board] Move MakeMoveBuilder::new() to an impl that specifies NoMove
I can build these now without having to specify a type for M.
2024-01-22 08:18:19 -08:00
bf2bccbc7d [board] Implement PositionBuilder::from_position
Create a PositionBuilder from a Position.
2024-01-22 08:12:55 -08:00
c1008ef672 [board] Put a cached Moves object into a OnceCell on Position
Cache move generation so we don't have to remake it every time.
2024-01-22 08:12:28 -08:00
8dbf44c741 [board] Rename position::MoveBuilder → MakeMoveBuilder 2024-01-22 08:11:02 -08:00
c642c1158a [board] Implement TryFrom on string types for Color and Shape 2024-01-22 08:10:40 -08:00
3dfebb22eb [board] Declare ToFen and implement it on Position and supporting types
I can now print a position in FEN!
2024-01-21 15:10:59 -08:00
dbbf2d4c46 [board] Implement ply and full move counters on Position
Pipe these numbers through the Builders
2024-01-21 15:10:04 -08:00
829d9af52c [board] Fix some bugs in the starting position
Turns out I was doing the starting position really wrong. In an upcoming commit,
I will implement FEN output for Positions. While doing that work, I found several
issues that were causing the output of the FEN formatter to return garbage.

Implement a handful of unit tests to track down the errors.

Rename Shape::_ascii_representation() → Shape::to_ascii.
Implement to_ascii() on Piece.
2024-01-21 14:56:03 -08:00
84c9c43a7d [board] Add a few comments in position::position
One TODO
And one doc comment.
2024-01-21 13:07:07 -08:00
704ee2f425 [board] Implement a test_position macro that prints a Position after it builds it
Update the sight tests to use test_position!
Remove a stray leftover mut.
Clean up the test imports.
2024-01-21 13:06:44 -08:00
3c699b0b3d [board] Remove the intermediate String when building a diagram representation of a Position
Also ignore the tests in position::diagram_formatter::tests. These don't assert
anything; they're just there for visual spot check.
2024-01-21 13:02:06 -08:00
72316ad5f5 [board] Write a bunch of tests to validate the flag methods on Move
I caught a bunch of bugs while implementing position::MoveBuilder in the flag
methods that Move exports. These tests caught many of them!
2024-01-21 13:01:03 -08:00
f90ea2d1be [board] Add a test for capturing en passant; fix the bugs
I wrote a test for capturing en passant that revealed some bugs. Cool!

Implement the missing part of move validation that checks for an en passant move.
Implement PositionBuilder::to_move() to set player_to_move.

The most difficult part of this fix was finding the logic error in
Move::is_en_passant(). Instead of checking for non-zero, check for equality against
the en passant flag value. Checking for non-zero was causing this method to return
true in the double push case.
2024-01-21 11:21:37 -08:00
683d89b726 [board] Convert a few more Piece and PlacedPiece to pass by ref 2024-01-21 10:39:57 -08:00
8835d8b40e [board] Add position::tests::rook_for_castle 2024-01-21 10:39:24 -08:00
fa1c6b452e [board] Remove BoardSide enum; use Castle everywhere
Move Castle to a castle module inside the move module.
Implement into_index() on Castle to turn it into a usize.
2024-01-21 10:38:50 -08:00
21b5266789 [board] Implement position::builders::MoveBuilder
This builder takes a Position and a Move, validates the move, and makes the move
in that position. Its build() method returns a new Position with the move made.
2024-01-21 09:23:39 -08:00
7b8ce3b31d [board] Derive Copy for Move 2024-01-21 09:21:48 -08:00
32ee25539d [board] Fix some en passant related stuff in the the sight module 2024-01-21 09:21:27 -08:00
d298a55254 [board] Clean up some stray muts and imports in the bishop move generator module 2024-01-21 09:20:31 -08:00
4a5ae8ec59 [board] Move position builders into a builders module
Move PositionBuilder to position_builder.rs and export it from the builders module.
2024-01-21 09:20:03 -08:00
1a907844d6 [board] Update a bunch of methods to take &Piece instead of plain Piece 2024-01-21 09:18:16 -08:00
f7951d6110 [board] Implement some is_shape getters on Piece and PlacedPiece 2024-01-21 09:15:41 -08:00
620701057d [board] Rehash BitBoard's std::ops implementations
Implement bitwise AND and OR for all permutations of BitBoard and &BitBoard.
Refer to the std::ops traits by fully-qualified path rather than requiring the
module to import those traits to implement them.

Implement bitwise AND and OR assignment (&= and |=) for BitBoard and &BitBoard.

Implement XOR and XOR assignment for BitBoards.
2024-01-21 09:14:02 -08:00
918b68f300 [board] Use Castle as the interface type for methods related to castling
Use BoardSide as an internal type for looking up generated bitboards, target squares, etc.
2024-01-21 09:05:42 -08:00
7071f6a742 [board] Cave to pressure and implement fmt::Display for Position
It prints a nice diagram!

Now I can make the position module private.
2024-01-19 18:12:28 -08:00
7f4485ed51 [board] Make the trailing comma in bitboard! optional
This a neat trick!
2024-01-19 18:09:22 -08:00
24cce95a88 [board] Implement a PositionBuilder; refactor piece bitboards into a PieceBitBoards struct
This makes Position immutable, even if declared mut. I think this will also make
it easier to build positions going forward.

Moving to a PieceBitBoards struct also required a lot of places that return owned
BitBoards to return refs. This is basically fine except for adding a few more &
here and there.

This was a huge refactoring project. All the move generators and a bunch of
BitBoard stuff needed to be updated.
2024-01-19 18:09:05 -08:00
939fac80d7 [board] Implement Default for BitBoard and Color 2024-01-19 18:09:05 -08:00
c413db0bf1 [board] Clean up Display and Debug implementations on BitBoard, Flags, Position, and PlacedPiece 2024-01-19 18:09:05 -08:00
2269df2ed9 [board] Move piece! and position! macros to a new macros.rs module 2024-01-19 18:09:05 -08:00
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