Fonctionnement d'un jeu d'échecs | ||||||||||||||||||||||||||||||||||||||||||||
Introduction | ||||||||||||||||||||||||||||||||||||||||||||
Depuis 20 ans, une centaine de programmes d'échecs
ont été commercialisés, et ce chiffre doit approcher
les 500 si l'on compte les programmes amateurs. Pourtant, en première
analyse, tous reposent sur des principes identiques qui ont fait leurs
preuves dans la théorie du jeu (algorithme minimax et alpha-bêta...). Tout d'abord, posons quelques règles de base. |
||||||||||||||||||||||||||||||||||||||||||||
L'échiquier, ses limites et le mouvement des pièces | ||||||||||||||||||||||||||||||||||||||||||||
Je vais citer plusieurs méthodes, mais sachez
que mon jeu d'échecs emploiera la troisième (bitboard). Commençons par faire simple, puisqu'aux échecs une case peut-être occupée par une des six pièces blanches, une des six pièces noires ou tout simplement être vide, on va coder chaque type de pièce par une valeur numérique. Il nous vient tout de suite à l'idée qu'une valeur s'échelonnant de -6 à 6 serait largement suffisant (On pourrait également différentier chaque pièce, ex: cavalier blanc dame et cavalier blanc roi). Ainsi on aura:
Leurs homologues noirs seront négatives. Passons à l'étape suivante. Pour les deux premières méthodes, la différence va se faire au niveau de la représentation de l'échiquier. Voici la première: Chaque case est située en fonction de sa colonne et de sa ligne et est donc un élément de la matrice carrée 8x8 suivante (gréco-latin): Cette notation, très proche de la notation échiquéenne,
à le mérite d'être clair; ainsi le mouvement e2-e4
sera codé par (5, 2)-(5, 4).
Un inconvénient est qu'elle utilise des tableaux à
deux dimensions. Or les opérations sont plus compliquées
que sur un tableau unidimensionnel et donc un peu plus longues à
effectuer pour le processeur... et répétés un
million de fois par seconde pendant trois minutes, cela devient vraiment
un handicape. Nous allons ici utiliser un échiquier à une dimension... Examinons ce que cela donnerait avec un tableau 8x8: Soit la même tour qu'au cas précédent positionnée en 26 (c4), analysons ses mouvements vers la gauche; on voudrait décrémenter de 1 jusqu'à atteindre les limites de l'échiquier. Or, on voit que si cela marche en effet pour les cases 25 et 24, ce n'est plus le cas ensuite puisqu'il n'y a aucune condition d'arrêt. Aussi nous allons utiliser une matrice carrée de 144 éléments (cet échiquier étendue est appelé Mailbox) qui donnera la possibilité de déterminer rapidement si une pièce sort de l'échiquier :
Nous aurons par exemple dans la position de départ l'échiquier suivant: Bien sûr les cases 7 garderont toujours les mêmes valeurs
tandis que la valeur des autres évoluera au cours de la partie. Nous écrirons donc la fonction Init(), qui initialise l'échiquier, ainsi (en C/C++):
Venons-en à la troisième technique: les Bitboard. |
||||||||||||||||||||||||||||||||||||||||||||
Les bitboard | ||||||||||||||||||||||||||||||||||||||||||||
Depuis la venue des processeurs 64 bits (genre Pentium)
il est apparue une nouvelle méthode de codage de l'échiquier.
Celle ci s'est vite imposée autant par son côté
esthétique que par sa vitesse de traitement. En effet un processeur
est dit 64 bits lorsqu'il peut traiter, en un cycle d'horloge, un nombre
-ou un mot- de 64 bits. Or un échiquier est pourvu de 64 cases...de
là il n'y qu'un pas à franchir pour optimiser le temps
de traitement d'une position. De plus en opérant directement
à l'aide d'une notation binaire, on peut utiliser les opérateurs
booléens ainsi que les opérateurs de décalages
(voir ces termes dans le glossaire) qui permettent de multiplier (par
un multiple de 2) très rapidement un nombre. Vu qu'un seul de ces nombres de 64 bits ne suffira pas du tout à coder l'échiquier on va en utiliser plusieurs qui représenteront la position des pions blancs, la position des pions noirs, etc. Par exemple, on aura une variable nommée "WhitePieces" qui donnera le statut des pièces blanches, une variable nommée "WhiteKnights" qui donnera la position des cavaliers blancs... Elles auront respectivement pour valeurs initiales 0000000000000000000000000000000000000000000000001111111111111111 et 0000000000000000000000000000000000000000000000000000000001000010 qu'on préférera représenter ainsi: et: |
||||||||||||||||||||||||||||||||||||||||||||
Copyright 2004 Civitarese Jonathan |
||||||||||||||||||||||||||||||||||||||||||||