Piszę silnik szachowy C ++ i szukam magicznych liczb dla bitboardów Little-Endian Rank-File Mapping do generowania ruchów dla przesuwanych elementów.
Rywal szachy strona daje magiczne liczby, ale nie do tego samego mapowania pokładzie.
Wiki programowania szachowego podaje jedne z najlepszych jak dotąd magicznych liczb, ale nie jest wyczerpujące.
Na koniec szukam czterech rzeczy:
- maska zajętości dla każdego kwadratu
- magiczna liczba dla każdego kwadratu
- magiczne przesunięcia dla każdego kwadratu
- przenosi tablicę bazy danych dla każdego kwadratu
Więc mogę użyć następującego kodu, aby znaleźć ruchy Wieży na C3 (na przykład):
bbBlockers = bbAllPieces & occupancyMaskRook[C3]
databaseIndex = (int)((bbBlockers * magicNumberRook[C3]) >> rookMagicShifts[C3])
bbMoveSquares = magicMovesRook[C3][databaseIndex] & ~bbFriendlyPieces
engines
software
programming
Romain
źródło
źródło
Odpowiedzi:
Jest to bardzo dobrze znany problem w programowaniu szachowym. Powinieneś rozważyć użycie liczb wygenerowanych przez Pradyumnę Kannan. Dr Kannan uprzejmie opracował magiczne liczby open source. Jest używany przez Podstępnego i kilka innych silników szachowych, w tym mój własny.
Możesz przeczytać więcej w Google „Podstępna magiczna liczba”.
Mam przygotowany skompresowanego pliku dla ciebie tutaj . Są to te same pliki, które są używane w aplikacji silnika szachowego SmallChess. Proszę przeczytać dokumentację. Zasadniczo musisz zadzwonić do Rmagic (kwadrat, obłożenie) dla wież i Bmagic (kwadrat, obłożenie) dla biskupów. Możesz XOR je w maskę królowej.
źródło