Commit graph

26 commits

Author SHA1 Message Date
0d8653894a An attempt at making unit structs for Color and piece Shape
My idea was to implement traits on Piece that return sight lines, etc. This has
turned out to be much more complex than I thought it would be. Ultimately, I
don't think it's worth the effort.
2024-01-14 10:23:35 -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
657a501cb5 Take self by value in all BitBoard shift methods 2024-01-06 16:22:39 -08:00
5a7e498d5d Iterate on Squares when building the BitBoard library 2024-01-06 16:22:22 -08:00
ff839db041 BitBoard changes
- Clean up operator traits: remove the & versions and make the macro do more with less input
- Implement From<Square> for BitBoards: simplify conversion of Squares to BitBoards
- Take BitBoards by value in several places
- Clean up unit tests
2024-01-06 16:21:40 -08:00
769886086c [board] Get king moves from the bitboard library 2024-01-02 08:42:47 -08:00
06bfc4ac57 [board] Implement a BitBoard MoveLibrary
This struct computes and stores piece moves per square to speed up computation
of move lists.

Initialize a `static mut` instance once via std::sync::Once, and return a static
reference to it. So far, it computes king and knight moves.

Make BitBoard::empty() and MoveLibrary::new() const functions, enabling static
construction of the MOVE_LIBRARY instance without needing to wrap it in an
Option.
2024-01-01 09:25:35 -08:00
af36b75df7 [board] Implement a pawn move generator
Holy heck I went on a *journey* here. Ultimately, I needed to implement my own
index-based iterator instead of using the Vec's Iterator.

This type establishes some patterns I want to carry forward to other move
generators.

1. The use of a Parameters struct to fully parameterize the move generation
   per-color. That lets these types only need a single color-based branch
2. A list of move lists, one list for each of captures, promotions, and quiet
   moves.
3. An index-based move iterator.
4. Separate impl for generating bitboard representations of these moves

Additional changes:

- Implement BitBoard::from_square()
- Implement a Square::e5() for tests

This class doesn't implement en passant yet. It also doesn't yet have tests for
the bitboard stuff.
2023-12-31 11:44:47 -08:00
adc2f76e00 [board] Change the type of BitScanner.shift form u32 to usize 2023-12-31 09:27:16 -08:00
1cc8b4520f [board] Return copies of rank and file bitboards from static lists 2023-12-31 09:26:20 -08:00
e30bcb3105 [board] Implement BitBoard::file and fmt::Display for BitBoard
BitBoard::file returns a BitBoard representing the 0-indexed file.
fmt::Display prints a grid of bits in the standard orientation (white on bottom, left to right)
Add asserts to the rank and file constructors to catch out of bounds arguments.
2023-12-30 10:26:37 -08:00
53dc80b6bb [board] Implement BitAndAssign and BitOrAssign on BitBoard 2023-12-29 16:34:11 -08:00
808222eef1 [board] Clean up the formatting of BitBoards
Use debug_tuple in the fmt::Debug implementation.
Implement fmt::Binary, fmt::UpperHex, and fmt::LowerHex by delegating to u64's version.
2023-12-29 15:37:38 -08:00
41421dddbb [board] Clean up interfaces of pieces and square structs 2023-12-29 09:17:33 -08:00
90db9b194f [board] Implement BitBoard::shift_east 2023-12-29 08:58:34 -08:00
2296be23cc [board] Rename BitBoard::from_bit_field → ::new 2023-12-28 21:42:18 -07:00
4c9e6a51fc [board] Move all the BitBoard shift code to a new bitboard::shifts module 2023-12-28 12:14:30 -07:00
5a08a4477e [board] Implement BitBoard::shift_south 2023-12-28 12:10:39 -07:00
5e47d37aa3 [board] Add a negative test for BitBoard::is_empty()
Remove a stray println!
2023-12-27 10:28:44 -07:00
61448d437f [board] Implement a BitBoard::rank constructor
Also implement BitBoard::shift_north() to support rank().
2023-12-27 10:04:02 -07:00
51a265172b [board] Implement an infix_op! macro for generating BitBoard operator traits 2023-12-27 10:00:30 -07:00
9d0761f8c6 [board] Rename from_algebraic_string → from_algebraic_str 2023-12-26 13:28:25 -07:00
758a3d95fc [board] Reorganize bitboard and position modules and export some symbols from the crate
Move position.rs to the position module and create a mod.rs.
Do the same for bitboard.rs in the bitboard modules.
Export Color, Piece, Position, and Square and use crate::Thing directly instead of referring to the symbol in the nested modules.
2023-12-26 11:25:27 -07:00
e23c20486e [board] Build error and warning fixes
- Remove unused import from bit_scanner.rs
- Rename PieceShape → Shape in the Position tests
2023-12-26 09:16:55 -07:00
1da827a3bb [board] Implement a BitScanner on u64
This struct implements an Iterator that returns the positions of the 1 bits in the u64.
BitBoard takes this iterator and maps it into Squares in the pieces() method.

This is laying the groundwork for an iterator over the pieces in a Position. 👀
2023-12-23 23:04:18 -07:00