这个项目能做什么
# chess_z
chess_z 是一个用 C 语言实现的中国象棋软件框架,当前重点是规则核心和 AI 接入边界。
## 主要特性
- **位棋盘表示**:90 格棋盘使用双 `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
```
两个程序默认使用 `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 个局面,每行一个 FEN。搜索程序顺序读取一次文件,以最大深度 6、不限时的配置为每个局面搜索一步,适合作为性能分析的非交互式入口。
## 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 行书写,使用大写表示红方,小写表示黑方。
评论
0 评分人数达到10人后显示
登录后参与讨论。