Commit graph

246 commits

Author SHA1 Message Date
b3c472fbce Fix some imports in the moves package
Castle and EnPassant moved to the board package. Reference these types there.
Add the board packages as a dependency to the moves package.
2024-04-26 09:50:42 -04:00
1d82d27f84 Move a whole bunch of stuff to the new chessfriend_board package 2024-04-25 13:28:24 -07:00
797606785e Empty board package 2024-04-25 09:32:27 -07:00
220da08727 Directly rename board -> position 2024-01-28 09:56:57 -08:00
569693bda9 Merge branch 'main' into rename-board-crate
# Conflicts:
#	explorer/src/main.rs
2024-01-28 09:55:53 -08:00
6bd3787a24 [board] Write test_position!({starting,empty}) macros
These produce starting and empty positions, respectively, and then print the
position.
2024-01-28 09:47:25 -08:00
66d03d3514 [board] Clean up a bunch of imports 2024-01-28 09:46:38 -08:00
1e77bc5ebb [board] Test to verify the king can't move into or stay in check
Write a test on the king move generator to verify the king can't move to a
square where it would still be in check.
2024-01-28 09:45:13 -08:00
76ac719418 [position] Rename the board crate → chessfriend_position in Cargo.toml
Rename the crate, but don't move any files.
2024-01-28 09:40:45 -08:00
b002442b42 [board] Implement a custom PartialEq on Position
We don't need to compare cached data. The load-bearing parts of a Position are:
player to move, position of all pieces, flags, and en passant status.

Inspiration for this implementation came from the FEN spec. It specifies all
these in the string.
2024-01-28 09:16:22 -08:00
164fe94bc0 [board] Implement danger squares for the current player
This concept comes from [1]. Danger squares are the squares a king cannot move to
because it would permit the opposing player to capture the king on their next
turn.

[1]: https://peterellisjones.com/posts/generating-legal-chess-moves-efficiently/
2024-01-28 09:08:22 -08:00
654e4094d9 [board] Restructure the move_generator module
Move mod.rs to ../move_generator.rs. This is the new style.
Move the contents of move_generator::move_generator to the top of move_generator.
2024-01-27 14:25:38 -08:00
9d25414b97 [board] Directly use PlacedPiece in the position! macro
Avoids having to also import the piece! macro to use position!.
2024-01-27 13:04:22 -08:00
e8d7f15a7f [board] Simplify the piece placement strategy logic
Check whether the strategy is PreserveExisting before checking if the piece is
already placed.
2024-01-27 13:03:18 -08:00
bea6dd67c8 [board] Remove the position reference from move generator structs
Simplifies the lifetime calculations, and makes it possible to cache a Moves
object on Position.
2024-01-27 13:02:43 -08:00
d3ab477795 [board] Remove a stray space in move_generator/mod.rs 2024-01-26 12:59:23 -08:00
6292421b1c [board] Clean up imports in fen.rs 2024-01-26 12:59:05 -08:00
54c94a93aa [board] Rewrite the pawn move generator
I wrote it before I made the MoveGeneratorInternal trait.
Found a few bugs in there too.
2024-01-26 08:38:01 -08:00
d27c455ce4 Merge branch 'many-crates' 2024-01-24 17:14:30 -08:00
88c0638d83 [board] Check that move is in sight of piece
If it's not, return an error from MoveBuilder::make()
2024-01-24 17:10:10 -08:00
1b5319c702 [board] Pass a Color to Position::king_square
Now it can return either color's king.
2024-01-24 17:09:15 -08:00
8b2a3926b3 [core,board] Move board::piece to core
Break up types in core into finer grained modules.
Update all the imports.
2024-01-24 17:08:27 -08:00
6f85305912 [board] Clean up a bunch of build errors
Fix imports to refer to core and bitboard crates.
Fix some API use errors.
2024-01-24 09:18:12 -08:00
b0b22048a8 [core] Rename (once again) chess_core → chessfriend_core 2024-01-24 08:48:19 -08:00
625bfb2446 [bitboard] Move everything in board::bitboard to the bitboard crate 2024-01-24 08:35:28 -08:00
106800bcb3 [core,board] Update all use imports referring to Square, Rank, and File 2024-01-24 08:32:09 -08:00
406631b617 [core] Move the contents of board::square to core::coordinates
Export Square, Rank, and File from the core crate.
2024-01-24 08:25:56 -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