Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Napoleon - movedatabase.h

movedatabase.h

Caricato da: Crybot
Scarica il programma completo

  1. #ifndef MOVEDATABASE_H
  2. #define MOVEDATABASE_H
  3. #include "defines.h"
  4. #include "utils.h"
  5. #include "constants.h"
  6.  
  7. namespace Napoleon
  8. {
  9.     class MoveDatabase
  10.     {
  11.     public:
  12.         static BitBoard PawnAttacks[2][64]; // color, square
  13.         static BitBoard KingAttacks[64]; // square
  14.         static BitBoard KnightAttacks[64]; // square
  15.  
  16.         static BitBoard PseudoRookAttacks[64]; // square
  17.         static BitBoard PseudoBishopAttacks[64]; // square
  18.         static BitBoard ObstructedTable[64][64]; // square, square
  19.  
  20.         static BitBoard GetRankAttacks(BitBoard, Square);
  21.         static BitBoard GetFileAttacks(BitBoard, Square);
  22.         static BitBoard GetA1H8DiagonalAttacks(BitBoard, Square);
  23.         static BitBoard GetH1A8DiagonalAttacks(BitBoard, Square);
  24.         static bool AreSquareAligned(Square, Square, Square);
  25.         static void InitAttacks();
  26.  
  27.     private:
  28.         static BitBoard RankAttacks[64][64]; // square , occupancy
  29.         static BitBoard FileAttacks[64][64]; // square , occupancy
  30.         static BitBoard A1H8DiagonalAttacks[64][64]; // square , occupancy
  31.         static BitBoard H1A8DiagonalAttacks[64][64]; // square , occupancy
  32.  
  33.         static void initPawnAttacks();
  34.         static void initKnightAttacks();
  35.         static void initKingAttacks();
  36.         static void initRankAttacks();
  37.         static void initFileAttacks();
  38.         static void initDiagonalAttacks();
  39.         static void initAntiDiagonalAttacks();
  40.         static void initPseudoAttacks();
  41.         static void initObstructedTable();
  42.     };
  43.  
  44.     INLINE BitBoard MoveDatabase::GetRankAttacks(BitBoard occupiedSquares, Square square)
  45.     {
  46.         int rank = Utils::Square::GetRankIndex(square);
  47.         int occupancy = (int)((occupiedSquares & Constants::Masks::SixBitRankMask[rank]) >> (8 * rank));
  48.         return RankAttacks[square][(occupancy >> 1) & 63];
  49.     }
  50.  
  51.     INLINE BitBoard MoveDatabase::GetFileAttacks(BitBoard occupiedSquares, Square square)
  52.     {
  53.         int file = Utils::Square::GetFileIndex(square);
  54.         int occupancy = (int)((occupiedSquares & Constants::Masks::SixBitFileMask[file]) * Constants::Magics::FileMagic[file] >> 56);
  55.         return FileAttacks[square][(occupancy >> 1) & 63];
  56.     }
  57.  
  58.     INLINE BitBoard MoveDatabase::GetA1H8DiagonalAttacks(BitBoard occupiedSquares, Square square)
  59.     {
  60.         int diag = Utils::Square::GetA1H8DiagonalIndex(square);
  61.         int occupancy = (int)((occupiedSquares & Constants::Masks::A1H8DiagonalMask[diag]) * Constants::Magics::A1H8DiagonalMagic[diag] >> 56);
  62.         return A1H8DiagonalAttacks[square][(occupancy >> 1) & 63];
  63.     }
  64.  
  65.     INLINE BitBoard MoveDatabase::GetH1A8DiagonalAttacks(BitBoard occupiedSquares, Square square)
  66.     {
  67.         int diag = Utils::Square::GetH1A8AntiDiagonalIndex(square);
  68.         int occupancy = (int)((occupiedSquares & Constants::Masks::H1A8DiagonalMask[diag]) * Constants::Magics::H1A8DiagonalMagic[diag] >> 56);
  69.         return H1A8DiagonalAttacks[square][(occupancy >> 1) & 63];
  70.     }
  71.  
  72.     INLINE bool MoveDatabase::AreSquareAligned(Square s1, Square s2, Square s3)
  73.     {
  74.         return (ObstructedTable[s1][s2] | ObstructedTable[s1][s3] | ObstructedTable[s2][s3])
  75.                 & (Constants::Masks::SquareMask[s1] | Constants::Masks::SquareMask[s2] | Constants::Masks::SquareMask[s3]);
  76.     }
  77. }
  78.  
  79. #endif // MOVEDATABASE_H