Estou escrevendo um mecanismo de xadrez C ++ e estou procurando números mágicos para as placas de bitmap Little-Endian Rank-File Mapping para gerar movimentos para peças deslizantes.
O site rival do xadrez fornece números mágicos, mas não para o mesmo mapeamento do tabuleiro.
O wiki de programação de xadrez fornece alguns dos melhores números mágicos até agora, mas não é exaustivo.
No final, estou procurando quatro coisas:
- máscara de ocupação para cada quadrado
- número mágico para cada quadrado
- mudanças mágicas para cada quadrado
- move a matriz do banco de dados para cada quadrado
Para que eu possa usar o código a seguir para encontrar os movimentos da torre no C3 (por exemplo):
bbBlockers = bbAllPieces & occupancyMaskRook[C3]
databaseIndex = (int)((bbBlockers * magicNumberRook[C3]) >> rookMagicShifts[C3])
bbMoveSquares = magicMovesRook[C3][databaseIndex] & ~bbFriendlyPieces
engines
software
programming
Romain
fonte
fonte
Respostas:
Este é um problema muito conhecido na programação de xadrez. Você deve considerar usar os números gerados por Pradyumna Kannan. O Dr. Kannan produziu gentilmente os números mágicos de código aberto. Ele está sendo usado pelo Crafty e alguns outros mecanismos de xadrez, incluindo o meu.
Você pode ler mais no google "número mágico astuto".
Preparei um arquivo compactado para você aqui . Esses são os mesmos arquivos usados no aplicativo de mecanismo de xadrez do SmallChess. Por favor, leia a documentação. Basicamente, você precisará chamar Rmagic (praça, ocupação) para gralhas e Bmagic (praça, ocupação) para bispos. Você pode XOR aqueles em uma máscara de rainha.
fonte