Sobre el proyecto
# chess_z
chess_z es un marco de software de ajedrez chino implementado en C, centrado actualmente en el núcleo de reglas y en el límite de integración con IA.
## Características principales
- **Representación con bitboards**: el tablero de 90 casillas se representa mediante dos `uint64_t` como bitboards, con un bitboard independiente para cada tipo de pieza de cada bando.
- **Matriz de correo**: se mantiene sincronizada una matriz de correo `board[90]` para facilitar la generación de reglas y la depuración.
- **Soporte completo de reglas**: admite la posición inicial, lectura y escritura de FEN, realización de jugadas, generación de jugadas legales, detección de jaque y perft.
- **Interfaz de adaptación para IA**: proporciona `XqEngineAdapter`, que permite conectar posteriormente funciones externas de búsqueda/evaluación de ajedrez.
- **Motor sencillo integrado**: incluye una evaluación muy pequeña de material y movilidad de jugadas legales más una búsqueda negamax, utilizada principalmente como prueba de humo del marco.
## Estructura de directorios
```text
include/xiangqi/bitboard.h Operaciones básicas de bitboards
include/xiangqi/types.h Tipos básicos, piezas, jugadas
include/xiangqi/position.h Representación de posición, FEN, realización de jugadas
include/xiangqi/movegen.h Jugadas pseudo-legales/legales, detección de jaque, perft
include/xiangqi/engine.h Interfaz de adaptación del motor de IA
src/ Implementación principal
examples/cli.c Ejemplo de entrada de línea de comandos
stats/generate_positions.c Entrada para generación de posiciones legales aleatorias
stats/search_positions.c Entrada para búsqueda por lotes de posiciones
stats/random_fen/ Datos FEN de posiciones aleatorias
stats/data/ Resultados de análisis de rendimiento
tests/test_core.c Pruebas básicas de reglas
```
## Compilación
Se recomienda usar CMake:
```sh
cmake -S . -B build
cmake --build build
ctest --test-dir build
```
Si en la máquina solo está disponible GCC, también se pueden compilar las pruebas directamente:
```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
```
Compilación del ejemplo interactivo humano-máquina:
```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
```
La entrada de ejemplo predeterminada es "tú juegas con las rojas y el motor sencillo integrado juega con las negras". El formato de entrada es `casilla inicial + casilla final`, con columnas `a..i` y filas `0..9`, por ejemplo:
```text
b2b9
```
Comandos disponibles:
```text
moves Imprime todas las jugadas legales actuales
fen Imprime el FEN actual
help Imprime la ayuda
quit Sale
```
## Generación de posiciones aleatorias y búsqueda por lotes
Después de compilar, se puede generar primero un conjunto reproducible de posiciones legales aleatorias y luego hacer que el motor integrado las busque una por una:
```sh
./build/xiangqi_generate_positions
./build/xiangqi_search_positions
```
Ambos programas usan de forma predeterminada `stats/random_fen/random_positions.fen`; también se puede especificar la misma ruta de archivo para ambos:
```sh
./build/xiangqi_generate_positions build/profile_positions.fen
./build/xiangqi_search_positions build/profile_positions.fen
```
El generador usa una semilla aleatoria fija, realiza de `0` a `100` jugadas aleatorias desde la posición inicial y produce en total 100 posiciones, una FEN por línea. El programa de búsqueda lee el archivo una vez de forma secuencial y busca una jugada para cada posición con una profundidad máxima de 6 y sin límite de tiempo, lo que resulta adecuado como entrada no interactiva para análisis de rendimiento.
## Integración con IA
Una IA externa puede reutilizar directamente la capa de reglas:
```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]);
/* realizar búsqueda o evaluación sobre next */
}
```
También se puede conectar una búsqueda personalizada mediante `XqEngineAdapter`:
```c
static bool my_search(const XqPosition *pos, unsigned depth, XqMove *best, void *user) {
(void)user;
/* usa xq_generate_legal / xq_position_make_move para implementar tu propia búsqueda */
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);
```
## Convenciones de coordenadas
- `file` está en el rango `0..8` y `rank` en el rango `0..9`.
- La primera fila del bando rojo es `rank = 0` y la primera fila del bando negro es `rank = 9`.
- `xq_square_make(file, rank)` asigna las coordenadas a `rank * 9 + file`.
- El FEN se escribe en 10 filas desde el bando negro hasta el bando rojo, usando mayúsculas para las piezas rojas y minúsculas para las negras.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.