À propos du projet
# chess_z
chess_z est un cadre logiciel pour le Xiangqi (échecs chinois) implémenté en C, dont l'objectif actuel est le cœur des règles et la frontière d'intégration de l'IA.
## Caractéristiques principales
- **Représentation par bitboards** : le plateau de 90 cases utilise une représentation à double bitboard `uint64_t`, chaque type de pièce de chaque camp disposant de son propre bitboard.
- **Tableau mailbox** : un tableau mailbox `board[90]` est maintenu en synchronisation, ce qui facilite la génération des règles et le débogage.
- **Prise en charge complète des règles** : prise en charge de la position initiale, lecture/écriture FEN, déplacement des pièces, génération des coups légaux, détection d'échec et perft.
- **Interface d'adaptation IA** : fournit `XqEngineAdapter`, permettant d'intégrer ultérieurement des fonctions externes de recherche/évaluation d'IA pour le Xiangqi.
- **Moteur simple intégré** : comprend une très petite évaluation basée sur le matériel et la mobilité des coups légaux + une recherche negamax, principalement destinée aux tests de fumée du cadre.
## Structure des répertoires
```text
include/xiangqi/bitboard.h opérations de base sur les bitboards
include/xiangqi/types.h types de base, pièces, coups
include/xiangqi/position.h représentation de la position, FEN, déplacements
include/xiangqi/movegen.h coups pseudo-légaux/légaux, détection d'échec, perft
include/xiangqi/engine.h interface d'adaptation du moteur IA
src/ implémentation du cœur
examples/cli.c point d'entrée CLI d'exemple
stats/generate_positions.c point d'entrée de génération de positions légales aléatoires
stats/search_positions.c point d'entrée de recherche par lots de positions
stats/random_fen/ données FEN de positions aléatoires
stats/data/ résultats d'analyse de performance
tests/test_core.c tests des règles de base
```
## Compilation
CMake est recommandé :
```sh
cmake -S . -B build
cmake --build build
ctest --test-dir build
```
Si seul GCC est disponible localement, il est également possible de compiler directement les tests :
```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
```
Compiler l'exemple interactif homme-machine :
```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
```
Le point d'entrée d'exemple est par défaut « vous jouez les rouges, le moteur simple intégré joue les noirs ». Le format de saisie est `départ+arrivée`, les colonnes utilisent `a..i`, les numéros de ligne utilisent `0..9`, par exemple :
```text
b2b9
```
Commandes disponibles :
```text
moves affiche tous les coups légaux actuels
fen affiche la FEN actuelle
help affiche l'aide
quit quitter
```
## Génération de positions aléatoires et recherche par lots
Après compilation, il est possible de générer d'abord un ensemble de positions légales aléatoires reproductibles, puis de laisser le moteur intégré les rechercher une par une :
```sh
./build/xiangqi_generate_positions
./build/xiangqi_search_positions
```
Les deux programmes utilisent par défaut `stats/random_fen/random_positions.fen`, mais il est également possible de leur spécifier le même chemin de fichier :
```sh
./build/xiangqi_generate_positions build/profile_positions.fen
./build/xiangqi_search_positions build/profile_positions.fen
```
Le générateur utilise une graine aléatoire fixe, effectue une marche aléatoire de `0..100` coups depuis la position initiale et produit 100 positions, une FEN par ligne. Le programme de recherche lit le fichier une fois séquentiellement et recherche un coup pour chaque position avec une profondeur maximale de 6 et sans limite de temps, ce qui en fait un point d'entrée non interactif adapté à l'analyse de performance.
## Intégration de l'IA
Une IA externe peut réutiliser directement la couche de règles :
```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]);
/* effectuer une recherche ou une évaluation sur next */
}
```
Il est également possible d'intégrer une recherche personnalisée via `XqEngineAdapter` :
```c
static bool my_search(const XqPosition *pos, unsigned depth, XqMove *best, void *user) {
(void)user;
/* implémenter sa propre recherche avec 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);
```
## Convention de coordonnées
- `file` va de `0..8`, `rank` va de `0..9`.
- La ligne de fond des rouges est `rank = 0`, celle des noirs est `rank = 9`.
- `xq_square_make(file, rank)` mappe les coordonnées en `rank * 9 + file`.
- La FEN s'écrit sur 10 lignes, des noirs vers les rouges, avec les majuscules pour les rouges et les minuscules pour les noirs.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.