Я пишу шахматный движок C ++ и ищу магические числа для битовых карт Little-Endian Rank-File Mapping, чтобы генерировать движения для скользящих фигур.
Состязательный шахматный сайт дает магические числа, но не для того же картографирования.
Вики по шахматному программированию пока дают одни из лучших магических чисел, но не являются исчерпывающими.
В конце я ищу четыре вещи:
- маска заполнения для каждого квадрата
- магическое число для каждого квадрата
- магические сдвиги для каждого квадрата
- перемещает массив базы данных для каждого квадрата
Поэтому я могу использовать следующий код, чтобы найти ходы ладьи на C3 (например):
bbBlockers = bbAllPieces & occupancyMaskRook[C3]
databaseIndex = (int)((bbBlockers * magicNumberRook[C3]) >> rookMagicShifts[C3])
bbMoveSquares = magicMovesRook[C3][databaseIndex] & ~bbFriendlyPieces
engines
software
programming
Ромен
источник
источник
Ответы:
Это очень известная проблема в шахматном программировании. Вам следует рассмотреть возможность использования чисел, сгенерированных Прадьюмной Каннан. Доктор Каннан любезно создал магические числа с открытым исходным кодом. Его используют Крафти и несколько других шахматных движков, включая мой собственный.
Вы можете прочитать больше по Google "Лукавый магический номер".
Я подготовил архив для вас здесь . Это те же файлы, которые используются в шахматном приложении SmallChess. Пожалуйста, прочитайте документацию. По сути, вам нужно вызвать Rmagic (квадрат, размещение) для грачей и Bmagic (квадрат, размещение) для епископов. Вы можете XOR те в маску королевы.
источник