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
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