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.