7 releases
Uses new Rust 2024
| 0.3.2 | May 13, 2025 |
|---|---|
| 0.3.1 | May 12, 2025 |
| 0.2.2 | Apr 16, 2025 |
| 0.1.0 | Apr 5, 2025 |
#163 in Games
461 downloads per month
305KB
5.5K
SLoC
haitaka ハイタカ

Rust Shogi move generation library
haitaka is a Shogi move generation library written in Rust that aims to support fast move generation.
It is inspired by the beautifully designed cozy-chess library written by analog-hors.
The layout of the modules and the overall design is largely the same as in cozy-chess. Many low-level functions were copied from cozy-chess, with only trivial modifications, but since there are significant differences between Shogi and International Chess, I also modified some of the higher-level functions and added extra functionality.
Name
"Haitaka" or "taka" means "sparrowhawk" in Japanese. "Taka" is a haiku kigo (season word) associated with winter.
鷹の眼にこぼれて雁のたち騒ぐ
Taka no me ni koborete kari no tachisawagu
Escaping the hawk's eye,
the wild geese
rise in tumult.
-— 加賀千代女 (Kaga no Chiyojo)
Overview
no_stdcompatible- Strongly-typed API that makes heavy use of newtypes to avoid errors
- Efficient bitboard-based board representation
- Performant legal move generation
- Incrementally updated zobrist hash for quickly obtaining a hash of a board
- Supporting both Magic Bitboards and the Qugiy algorithm for slider move generation
- Support for parsing SFEN strings
Main differences with cozy-chess
BitBoardusesu128instead ofu64as backing to handle the 9x9 Shogi board- Move generation handles both board moves and drops
- Move generation of sliders also implements the Qugiy algorithm
- File-major ordering of squares to make move generation faster
Crate features
std: Enable features that requirestd. Currently only used for theErrortrait.
Installation
Add haitaka to your Cargo.toml:
[dependencies]
haitaka = "0.2.1" # or use the latest version on crates.io
Usage
Basic
use haitaka::*;
// Start position
let board = Board::startpos();
let mut move_list = Vec::new();
board.generate_moves(|moves| {
// Unpack into move list
move_list.extend(moves);
false
});
assert_eq!(move_list.len(), 30);
Perft
cargo run --release --example perft -- 5
Testing
This code has been tested on an Apple M2, using the stable-aarch64-apple-darwin toolchain. In GitHub workflows it has also been tested on Ubuntu.
The code has not yet been used in a Shogi engine, so should still be seen as experimental.
To run all tests use:
cargo test
Contributing
Contributions are very welcome! Please open an issue or submit a pull request on GitHub.
Acknowledgments
Portions of this library are derived from the cozy-chess project by analog-hors. The cozy-chess project is licensed under the MIT license, and its license text is included in this repository under third_party/cozy-chess/LICENSE.