このプロジェクトについて
# chess_z
chess_z は C 言語で実装された中国象棋ソフトウェアフレームワークであり、現在はルールコアと AI 接続境界に重点を置いています。
## 主な特徴
- **ビットボード表現**:90 マスの盤面を 2 つの `uint64_t` ビットボードで表現し、各陣営の各駒種に独立した bitboard を持ちます。
- **メールボックス配列**:`board[90]` メールボックス配列を同期維持し、ルール生成とデバッグを容易にします。
- **完全なルールサポート**:初期局面、FEN 読み書き、駒の移動、合法手生成、王手検出、perft をサポートします。
- **AI アダプタインターフェース**:`XqEngineAdapter` を提供し、後から外部の象棋 AI 探索/評価関数を接続できます。
- **内蔵簡易エンジン**:非常に小さな駒の材質と合法手の機動性評価 + negamax 探索を含み、主にフレームワークのスモークテストに使用されます。
## ディレクトリ構造
```text
include/xiangqi/bitboard.h ビットボード基本操作
include/xiangqi/types.h 基本型、駒、着手
include/xiangqi/position.h 局面表現、FEN、駒の移動
include/xiangqi/movegen.h 疑似合法/合法手、王手検出、perft
include/xiangqi/engine.h AI エンジンアダプタインターフェース
src/ コア実装
examples/cli.c サンプルコマンドラインエントリ
stats/generate_positions.c ランダム合法局面生成エントリ
stats/search_positions.c バッチ局面探索エントリ
stats/random_fen/ ランダム局面 FEN データ
stats/data/ 性能分析結果
tests/test_core.c 基本ルールテスト
```
## ビルド
CMake の使用を推奨:
```sh
cmake -S . -B build
cmake --build build
ctest --test-dir build
```
ローカルに GCC しかない場合、直接テストをコンパイルすることもできます:
```sh
gcc -std=c99 -Wall -Wextra -Wpedantic -I include src/position.c src/movegen.c src/engine.c tests/test_core.c -o build/xiangqi_core_tests
./build/xiangqi_core_tests
```
対話式人機サンプルのコンパイル:
```sh
gcc -std=c99 -Wall -Wextra -Wpedantic -I include src/position.c src/movegen.c src/engine.c examples/cli.c -o build/xiangqi_cli
./build/xiangqi_cli
```
サンプルエントリはデフォルトで「あなたは紅方、内蔵簡易エンジンは黒方」です。入力形式は `起点+終点`、ファイルは `a..i`、行番号は `0..9`、例えば:
```text
b2b9
```
使用可能なコマンド:
```text
moves 現在のすべての合法手を表示
fen 現在の FEN を表示
help ヘルプを表示
quit 終了
```
## ランダム局面生成とバッチ探索
ビルド後、まず再現可能なランダム合法局面のセットを生成し、次に内蔵エンジンで一つずつ探索できます:
```sh
./build/xiangqi_generate_positions
./build/xiangqi_search_positions
```
2 つのプログラムはデフォルトで `stats/random_fen/random_positions.fen` を使用しますが、両方に同じファイルパスを指定することもできます:
```sh
./build/xiangqi_generate_positions build/profile_positions.fen
./build/xiangqi_search_positions build/profile_positions.fen
```
ジェネレータは固定ランダムシードを使用し、初期局面からランダムウォークを `0..100` 手行い、合計 100 局面を出力し、1 行に 1 つの FEN を出力します。探索プログラムはファイルを順次 1 回読み込み、最大深さ 6、時間無制限の設定で各局面に対して 1 手を探索し、性能分析の非対話式エントリとして適しています。
## AI 接続
外部 AI はルール層を直接再利用できます:
```c
XqMoveList legal;
xq_generate_legal(&pos, &legal);
for (int i = 0; i < legal.count; ++i) {
XqPosition next = pos;
xq_position_make_move(&next, legal.moves[i]);
/* next 上で探索または評価を行う */
}
```
`XqEngineAdapter` を通じてカスタム探索を接続することもできます:
```c
static bool my_search(const XqPosition *pos, unsigned depth, XqMove *best, void *user) {
(void)user;
/* xq_generate_legal / xq_position_make_move を使用して独自の探索を実装 */
return false;
}
XqEngineAdapter engine = {
.evaluate = NULL,
.search = my_search,
.user = NULL,
};
XqMove best;
XqSearchLimits limits = xq_search_limits_default();
xq_engine_find_best_move(&engine, &pos, &limits, &best);
```
## 座標規約
- `file` の範囲は `0..8`、`rank` の範囲は `0..9`。
- 紅方の底線は `rank = 0`、黒方の底線は `rank = 9`。
- `xq_square_make(file, rank)` は座標を `rank * 9 + file` にマッピングします。
- FEN は黒方から紅方への 10 行で記述し、大文字は紅方、小文字は黒方を表します。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.