Estoy escribiendo un motor de ajedrez C ++ y estoy buscando números mágicos para bitboards Little-Endian Rank-File Mapping para generar movimientos para piezas deslizantes.
El sitio web rival de ajedrez da números mágicos pero no para el mismo mapeo de tablero.
El wiki de programación de ajedrez ofrece algunos de los mejores números mágicos hasta ahora, pero no es exhaustivo.
Al final estoy buscando cuatro cosas:
- máscara de ocupación para cada cuadrado
- número mágico para cada cuadrado
- cambios mágicos para cada cuadrado
- mueve la matriz de la base de datos para cada cuadrado
Entonces puedo usar el siguiente código para encontrar los movimientos de Rook en C3 (por ejemplo):
bbBlockers = bbAllPieces & occupancyMaskRook[C3]
databaseIndex = (int)((bbBlockers * magicNumberRook[C3]) >> rookMagicShifts[C3])
bbMoveSquares = magicMovesRook[C3][databaseIndex] & ~bbFriendlyPieces
engines
software
programming
Romain
fuente
fuente
Respuestas:
Este es un problema muy conocido en la programación de ajedrez. Debería considerar usar los números generados por Pradyumna Kannan. El Dr. Kannan había producido amablemente los números mágicos de código abierto. Está siendo utilizado por Crafty y algunos otros motores de ajedrez, incluido el mío.
Puedes leer más en google "Crafty magic number".
He preparado un archivo comprimido para ti aquí . Estos son los mismos archivos que se usan en la aplicación del motor de ajedrez SmallChess. Por favor lea la documentación. Básicamente, deberás llamar a Rmagic (cuadrado, ocupación) para torres y Bmagic (cuadrado, ocupación) para obispos. Puedes convertirlos en una máscara de reina.
fuente