Je suppose que vous connaissez déjà le concept de Min-Max, les arbres et l'élagage, l'heuristique et d'autres bases et ce que j'écris ici ne sont que quelques détails qui auraient pu être sous-estimés.
En compagnie d'un ami, j'ai écrit notre propre moteur d'échecs il y a parfois. Je partage quelques problèmes et idées que nous avions et j'espère que vous les trouverez utiles.
Comme nous étions tous les deux des programmeurs java, notre langage s'est transformé en Java et nous avons commencé avec une approche orientée objet. Les pièces étaient des objets, le tableau était un objet, les fichiers et les rangs (rangées et colonnes dans la littérature d'échecs) étaient des objets. Et c'était faux. Les frais généraux étaient énormes et le programme avait du mal à aller plus loin que 2 mouvements (4 plis) dans l'arbre de recherche.
Donc, avec quelques recherches, nous nous sommes retrouvés avec une idée brillante (pas la nôtre cependant!): Représenter les pièces et le tableau comme des entiers longs (64 bits). Cela a du sens car un échiquier a 64 cases. Le reste était des opérations peu judicieuses (fonctionnant très près de cpu = extrêmement rapide). Par exemple, considérons un entier binaire 64 bits dans lequel ceux-ci présentent les carrés du tableau que votre pièce peut attaquer. Maintenant, si vous exécutez un "ET" logique entre deux nombres comme celui-ci, un résultat différent de zéro indique que vous avez un carré avec des attaquants. Il y a plusieurs façons de présenter l'échiquier et les pièces, donc:
1 - Décidez de la présentation de votre conseil
Ensuite, vous avez besoin et l'ouverture de la base de données. L'ouverture des échecs est en quelque sorte résolue et il est fortement recommandé d'avoir un livre d'ouverture. Dans ce cas, vous avez beaucoup de temps supplémentaire dans les jeux Blitz.
2 - Trouvez-vous un livre d'ouverture.
Nous l'avons fait, mais nous étions encore loin d'être bons:
3 - Un bon moteur d'échecs devrait pouvoir voir 6 coups (12 plis) devant.
Donc ce que nous avons fait alors, c'était d'utiliser le temps mort (si c'est un moteur humain vs ordinateur).
4 - Utilisez le temps où l'adversaire pense à créer certains niveaux de votre arbre.
Et pourtant nous étions loin de 12 plis. Par plus d'étude, nous découvrons quelques astuces! Par exemple, il a été suggéré de sauter un pli de l'arbre et de commencer par le pli suivant (comme s'il n'y avait pas d'adversaire). L'idée est que si un mouvement est extrêmement idiot, alors pourquoi perdre du temps et voir quelles sont les réponses des adversaires à ce mouvement. Cependant, un bon moteur devrait être capable de faire la distinction entre le mouvement idiot et le sacrifice de la reine du génie.
5 - Apprenez les astuces de programmation pour ce problème spécifique (échecs).
Mon ami et moi, dans cet état, étions encore mauvais: / Ce que nous pouvions faire - et nous l'avons fait en partie - était de sauvegarder les positions calculées. Si vous calculez une position, enregistrez-la pour l'avenir! Il en va de même pour les boucles dans l'arborescence de recherche. Le but était de sauvegarder / récupérer efficacement:
6 - Sauvegardez les données que vous générez ... efficacement!
et enfin:
7 - Code avec optimisation maximale.
Ce problème est extrêmement coûteux à la fois en temps CPU et en mémoire. Il est très important d'écrire votre code très efficacement. N'oubliez pas que nous parlons du facteur de branche de 35. Cela signifie qu'un "si" inutile quelque part dans votre heuristique, peut être transformé en 3.3792205e+18
"si" inutile quelque part au fond de votre arbre de recherche.
La programmation des échecs est un défi très très intéressant et c'est le moment où vous pouvez mettre vos capacités de programmation à rude épreuve. Il y a quelques autres points que je peux suggérer, mais je suis sûr que vous les découvrirez par vous-même. Il y a bien d'autres points que je ne connais pas mais vous pouvez les trouver sur internet!
Bonne chance et amusez-vous bien!
ps Je ne connais pas très bien javascript mais quelque chose me dit en fonction de la difficulté du problème, peut-être, compte tenu de tout ce que C ++ peut offrir, il serait préférable de supprimer javascript et de le faire en C ++.