このプロジェクトについて

# 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 行で記述し、大文字は紅方、小文字は黒方を表します。