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 - pawn.cpp

pawn.cpp

Caricato da: Crybot
Scarica il programma completo

  1. #include "pawn.h"
  2. #include "board.h"
  3. #include "compassrose.h"
  4.  
  5. namespace Napoleon
  6. {  
  7.     BitBoard Pawn::GetAllTargets(BitBoard pawns, Board& board)
  8.     {
  9.         BitBoard empty = board.EmptySquares;
  10.  
  11.         return GetQuietTargets(board.SideToMove, pawns, empty) | GetAnyAttack(pawns, board);
  12.     }
  13.  
  14.     BitBoard Pawn::GetAnyAttack(BitBoard pawns, Board& board)
  15.     {
  16.         return (GetEastAttacks(board.SideToMove, pawns) | GetWestAttacks(board.SideToMove, pawns)) & board.GetEnemyPieces();
  17.     }
  18.  
  19.  
  20.     BitBoard Pawn::GetQuietTargets(Color color, BitBoard pawns, BitBoard empty)
  21.     {
  22.         return GetSinglePushTargets(color, pawns, empty) | GetDoublePushTargets(color, pawns, empty);
  23.     }
  24.  
  25.     BitBoard Pawn::GetSinglePushTargets(Color color, BitBoard pawns, BitBoard empty)
  26.     {
  27.         return color == PieceColor::White ? CompassRose::OneStepNorth(pawns) & empty : CompassRose::OneStepSouth(pawns) & empty;
  28.     }
  29.  
  30.     BitBoard Pawn::GetDoublePushTargets(Color color, BitBoard pawns, BitBoard empty)
  31.     {
  32.         BitBoard singlePush = GetSinglePushTargets(color, pawns, empty);
  33.  
  34.         return color == PieceColor::White
  35.                 ? CompassRose::OneStepNorth(singlePush) & empty & Constants::Ranks::Four
  36.                 : CompassRose::OneStepSouth(singlePush) & empty & Constants::Ranks::Five;
  37.     }
  38.  
  39.     BitBoard Pawn::GetPawnsAbleToSinglePush(Color color, BitBoard pawns, BitBoard empty)
  40.     {
  41.         switch (color)
  42.         {
  43.         case PieceColor::White:
  44.             return CompassRose::OneStepSouth(empty) & pawns;
  45.         case PieceColor::Black:
  46.             return CompassRose::OneStepNorth(empty) & pawns;
  47.         default:
  48.             throw std::exception();
  49.         }
  50.     }
  51.  
  52.     BitBoard Pawn::GetPawnsAbleToDoublePush(Color color, BitBoard pawns, BitBoard empty)
  53.     {
  54.         switch (color)
  55.         {
  56.         case PieceColor::White:
  57.         {
  58.             BitBoard emptyRank3 = CompassRose::OneStepSouth(empty & Constants::Ranks::Four) & empty;
  59.             return GetPawnsAbleToSinglePush(color, pawns, emptyRank3);
  60.         }
  61.         case PieceColor::Black:
  62.         {
  63.             BitBoard emptyRank6 = CompassRose::OneStepNorth(empty & Constants::Ranks::Six) & empty;
  64.             return GetPawnsAbleToSinglePush(color, pawns, emptyRank6);
  65.         }
  66.         default:
  67.             throw std::exception();
  68.         }
  69.     }
  70.  
  71.     BitBoard Pawn::GetEastAttacks(Color color, BitBoard pawns)
  72.     {
  73.         return color == PieceColor::White ? CompassRose::OneStepNorthEast(pawns) : CompassRose::OneStepSouthEast(pawns);
  74.     }
  75.  
  76.     BitBoard Pawn::GetWestAttacks(Color color, BitBoard pawns)
  77.     {
  78.         return color == PieceColor::White ? CompassRose::OneStepNorthWest(pawns) : CompassRose::OneStepSouthWest(pawns);
  79.     }
  80.  
  81. }