| L'échiquier |
| Écrit par Sylvain Lacombe |
|
Puisqu'un échiquier possède 64 cases, 8 colonnes et 8 rangées, on pourrait penser que d'utiliser un tableau à deux dimensions de 8 x 8 serait l'idéal. Le problème est, lorsque nous voulons stocker les coups possibles d'une pièce, nous devons stocker deux valeurs pour chaque direction possible. C'est faisable mais légèrement moins rapide. Et, croyez-moi, le "légèrement moins rapide" devient beaucoup moins rapide lorsque le moteur évalue des milliers, et même, des millions de coups. La raison est que vous devez traiter deux valeurs à chaque fois. De plus, ça se gère un peu moins facilement. Il est préférable d'utiliser un tableau d'une seule dimension. Essayons par exemple un tableau de 64 cases à une seule dimension. Si nous voulons stocker les coups possibles d'une tour, il suffit alors d'une seule valeur.
Pour un fou, ça serait simplement:
Bien sûr, ces coups sont en réalité des directions que nous allons répéter pour générer chaque coup valide pour chaque direction. Nous verrons cela dans le générateur de coups. Les pièces
#define pion 1 Nous n'avons pas besoin de définir des constantes pour les pièces noires car nous n'avons qu'à faire -pion par exemple pour représenter un pion noir. enum {
Plaçons maintenant les pièces dessus. Voici le code étant explicatif en lui même grâce à nos constantes. /* Initialisation de l'échiquier. */ Voici ce que ça donne lorsqu'on l'imprime:
Autres informationsIl faut garder aussi quelques autres informations de plus. Par exemple, il faut connaitre la possibilité des roques, la possibilité d'un coup en passant, le joueur à jouer et le numéro du coup. Pour le joueur à jouer, nous utilisons seulement un entier. En C, un entier représente vrai pour toutes valeurs différentes de zéro. unsigned int baj ; C'est une abbréviation de Blanc à jouer. La variable est à 1 si c'est au blanc à jouer, sinon elle est à zéro. Pour le numéro du coup, un entier aussi. unsigned int noCoup; Pour le coup en passant, il faut garder la case où le pion aurait dû se faire capturer en passant. Cette case sera initialisée si le joueur adverse avance son pion de 2 cases sur le départ. int enPassant; // Valeur possible de 0 à 63. Pour terminer, les roques. Nous avons besoin de garder la possibilité du roque blanc côté dame, roque blanc côté roi, roque noir côté dame et roque noir côté roi. Nous n'avons besoin que d'un bit pour chacun. Prenons donc les quatres premiers bits d'un mot. #define ROQUEBLANCDAME 0x01 Pour l'initialisation, voici le code:
Je crois que c'est tout pour l'échiquier. Nous allons maintenant passer au générateur de coups.
/* Initialisation de l'échiquier. */ memset(echiquier, 0, sizeof(echiquier)); // met toutes les cases à 0. /* Les pions. */ for(i=A7; i<=H7; i++) echiquier[i] = -pion; // pions noirs for(i=A2; i<=H2; i++) echiquier[i] = pion; // pions blancs; /* Les cavaliers */ echiquier[B8] = echiquier[G8] = -cavalier; // cavaliers noirs echiquier[B1] = echiquier[G1] = cavalier; // cavaliers blancs /* Les fous */ echiquier[C8] = echiquier[F8] = -fou; // fous noirs echiquier[C1] = echiquier[F1] = fou; // fous blancs /* Les tours */ echiquier[A8] = echiquier[H8] = -tour; // tours noires echiquier[A1] = echiquier[H1] = tour; // tours blanches /* Les dames */ echiquier[D8] = -dame; // dame noire echiquier[D1] = dame; // dame blanche /* Les rois */ echiquier[E8] = -roi; // roi noir echiquier[E1] = roi; // roi blanc |
| Mise à jour le Lundi, 19 Octobre 2009 17:30 |
