#chess #shogi #no-std #board

no-std haitaka

Rust Shogi move generation library

4 releases

Uses new Rust 2024

0.2.2 Apr 16, 2025
0.2.1 Apr 14, 2025
0.2.0 Apr 10, 2025
0.1.0 Apr 5, 2025

#58 in Games

Download history 110/week @ 2025-04-02 233/week @ 2025-04-09 177/week @ 2025-04-16

520 downloads per month

MIT license

270KB
4.5K SLoC

haitaka ハイタカ   Latest Version Build Status Documentation

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_std compatible
  • 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

  • BitBoard uses u128 instead of u64 as 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 require std. Currently only used for the Error trait.

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.

References

Dependencies