shakmaty
A Rust library for chess move generation
Features
-
Generate legal moves:
use ; let pos = default; let legals = pos.legals; assert_eq!; -
Play moves:
use ; // 1. e4 let pos = pos.play?; -
Detect game end conditions:
pos.is_checkmate(),pos.is_stalemate(),pos.is_insufficient_material(),pos.outcome(). -
Read and write FENs, SANs and UCIs.
-
Supports standard chess, Chess960, Giveaway, Atomic, King Of The Hill, Three-Check, Crazyhouse, Racing Kings and Horde. Provides vocabulary to implement other variants.
-
Bitboards and compact fixed shift magic attack tables.
-
Probe Syzygy tablebases with shakmaty-syzygy.
Documentation
Benchmarks
Simple perft of the initial position. No hashtables. i7-6850K CPU @ 3.60GHz.
| perft | 4 | 5 |
|---|---|---|
| shakmaty | 1.4 ms | 33.8 ms |
| jordanbray/chess | 1.3 ms | 28.7 ms |
| Stockfish 8 (x86-64-bmi2) | 4 ms | 33 ms |
It should be noted that Stockfish is not optimized for perft speed and also maintains additional data structures for evaluation. Newer versions of Stockfish put even less emphasis on this.
Changelog
- 0.11.2
- Fix Atomic insufficient material: KQN can mate.
- 0.11.1
- Fix Chess960 should not allow a-side castling over a blocking h-side rook.
- 0.11.0
Outcomeis nowCopy.Position::castling_uncovers_rank_attack()is no longer public.
- 0.10.0
- Added
File,Rank. These are now returned bySquare::{file, rank}.Square::from_coords(file, rank)takes the new types and is no longer fallible. Bitboardis nowIntoIteratorinstead ofIteratoritself. MethodsBitboard::{first, last, count, is_empty}remain.Bitboard::{add, flip, discard, with, without}are now generic overInto<Bitboard>. Alternative methods*_allhave been removed.Bitboard::relative_shift(color, shift: u8)now takesu32.shakmaty::CarryRippleris nowshakmaty::bitboard::CarryRippler.- Add new methods:
Bitboard::{pop_front, pop_back, is_disjoint, is_subset, is_superset}. - Add
Position::has_insufficient_material(color).
- Added
- 0.9.0
- Remove
uci,chess960_uci,sanandsan_plusthat were deprecated in 0.8.1. - Renamed
*::from_bytes()to*::from_ascii(). - Take small copy types by value:
Piece::char(),CastlingSide::*. - Added
Castles::has(color, side). fen::{board_fen, epd, fen}are now shortcuts for formatting with default options.- Minimum rust version 1.27.0 (i128 conversions again, fused iterators again,
Option::filter(),dyn Trait). - Eliminate many uses of unsafe, including
TrustedLenimpls, at minor cost.
- Remove
- 0.8.1
- Make
Rolediscriminants public. - Put
San,SanPlusandUciconstructors onSan,SanPlusandUcirespectively.
- Make
- 0.8.0
- Revert fused iterators and u128. Minimum Rust version back to 1.23.0.
- Changed
Rolediscriminants. Now starting withPawn = 1. - Performance improvements (~12% faster perft).
- Switch benchmarks to
criterion.rs.
- 0.7.2
- Add
Outcome.winner().
- Add
- 0.7.1
- Minimum Rust version 1.26.0 (fused iterators, u128 conversions).
- 0.7.0
- Reintroduce the remaining Lichess variants:
Crazyhouse,KingOfTheHill,ThreeCheck,Horde,RacingKings. - Expose
Position.castles()and replacePosition.is_chess960()withPosition.castles().is_chess960(). - Fix insufficient material: KNvK was not given as drawn due to a typo.
- Fix insufficient material in
Atomic: Two knights of different colors are not safe. - Let
Pockets.count()andPocket.count()returnusize.
- Reintroduce the remaining Lichess variants:
- 0.6.7
- Giveaway starting position should have no castling rights.
- 0.6.6
- Fix missing king promotions in Giveaway.
- 0.6.5
- Validate color of missing king in atomic chess.
- Clear move buffers before generating variant moves.
- 0.6.4
- Reintroduce
GiveawayandAtomicchess variants.
- Reintroduce
- 0.6.3
- New method
Move.is_zeroing().
- New method
- 0.6.2
- Make unit error types (
InvalidSquareName,InvalidUci,InvalidSan) completely public. - Documentation, coding style and debugging tweaks.
- Make unit error types (
- 0.6.1
- Expose
attacks::bishop_maskandattacks::rook_mask. - Eliminate almost all unchecked indexing.
- Expose
- 0.6.0
- Split
impl From<Move> for Uciintouci()andchess960_uci(). - Fix display of pawn drops.
- Move generating methods clear the move buffer (and therefor no longer panic on too full buffers).
- Added
Position.is_chess960(),Bitboard.without_all(),Role.upper_char(),Board.stepper().
- Split
- 0.5.1
- Fix
Uci::to_move()for en passant moves. Thanks zxqfl.
- Fix
- 0.5.0
- Use
u64instead ofusizeforperft(). - Export error type
InvalidSquareName. - New methods:
CastlingSide.is_{queen|king}_side(),San.matches(),Move.is_capture(),Move.is_promotion(),Move.castling_side(),Position.is_check(). - Derive
OrdandPartialOrdforRole. - Support running benchmarks on stable.
- Use
- 0.4.2
- Fix build error on beta due to the new nightly
option_filterfeature. - Fix unterminated code block in documentation.
- Fix build error on beta due to the new nightly
- 0.4.1
- Fix build error due to the new nightly
option_filterfeature.
- Fix build error due to the new nightly
- 0.4.0
- Rename
Color::from_bool()toColor::from_white(), addColor::from_black(). - Add
Move::role(),Move::is_en_passant()andMove::is_castle(). - Add
Position::en_passant_moves()andPosition::capture_moves(). - Implement
BitXor<bool>forColor. - Implement
FusedIteratorandTrustedLenonBitboard.
- Rename
- 0.3.0
- Switch to
#[repr(i8)]forSquare. Implement all lossless integer conversionsFrom<Square>. - Add
Square::flip_horizontal(),flip_vertical()andflip_diagonal(). - Efficiently implement
CarryRippler::last()by @nvzqz. - Eliminate some unchecked indexing by @nvzqz.
- Faster ASCII case conversions and tests by @nvzqz.
- Switch to
- 0.2.0
Squareis now a#[repr(u8)]enum.- Use
bitflagsforPositionError. - Rename
RemainingChecks::subtract()todecrement(). - Add
Position::swap_turn().
- 0.1.0
- First release with support for stable Rust.
License
Shakmaty is licensed under the GPL-3.0 (or any later version at your option). See the COPYING file for the full license text.