J'écris un moteur d' échecs C ++ et je recherche des nombres magiques pour les bitboards de mappage de fichiers de rangs Little-Endian pour générer des mouvements pour les pièces coulissantes.
Le site Web d' échecs rival donne des nombres magiques mais pas pour le même mappage de plateau.
Le wiki de programmation d'échecs donne jusqu'à présent certains des meilleurs nombres magiques mais n'est pas exhaustif.
À la fin, je recherche quatre choses:
- masque d'occupation pour chaque carré
- nombre magique pour chaque carré
- décalages magiques pour chaque carré
- déplace le tableau de base de données pour chaque carré
Je peux donc utiliser le code suivant pour trouver les mouvements de la tour sur C3 (par exemple):
bbBlockers = bbAllPieces & occupancyMaskRook[C3]
databaseIndex = (int)((bbBlockers * magicNumberRook[C3]) >> rookMagicShifts[C3])
bbMoveSquares = magicMovesRook[C3][databaseIndex] & ~bbFriendlyPieces
engines
software
programming
Romain
la source
la source
Réponses:
C'est un problème très connu dans la programmation des échecs. Vous devriez envisager d'utiliser les chiffres générés par Pradyumna Kannan. Le Dr Kannan avait aimablement produit en open source les nombres magiques. Il est utilisé par Crafty et quelques autres moteurs d'échecs, dont le mien.
Vous pouvez en lire plus sur google "Crafty magic number".
J'ai préparé un fichier compressé pour vous ici . Ce sont les mêmes fichiers utilisés dans l'application du moteur d'échecs SmallChess. Veuillez lire la documentation. Fondamentalement, vous devrez appeler Rmagic (carré, occupation) pour les tours et Bmagic (carré, occupation) pour les évêques. Vous pouvez XOR ceux-ci dans un masque de reine.
la source