Ejemplo n.º 1
0
 private function UpdateCastlingBitmaps()
 {
     $this->nCalls++;
     $this->n64WhiteCastle->set_value('0x0');
     $this->n64BlackCastle->set_value('0x0');
     // If white king or black king are in check, then castling isn't possible;
     if ($this->PlayerTurn == 0 && $this->nStatus == CHESS_BOARD_STATUS::CHECK) {
         $this->n64WhiteCastle->set_value('0x0');
         return;
     } else {
         if ($this->PlayerTurn == 1 && $this->nStatus == CHESS_BOARD_STATUS::CHECK) {
             $this->n64BlackCastle->set_value('0x0');
             return;
         }
     }
     // NOTE: Limit to updating the castling bitboards to the next side to move because these bitboards
     // are only valid for the next move.
     // Need to check columns 2,3 and 5,6 for ranks 0 and 7 to see if they are empty and not attacked.
     if ($this->fCastleWQueenside) {
         if (BitBoard::_AND_($this->n64All, $this->n64WhiteCastleQFree)->is_zero()) {
             $bitmap = $this->FindAttacksToTile(0, 2)->_AND($this->n64BAll);
             if ($bitmap->is_zero()) {
                 $bitmap = $this->FindAttacksToTile(0, 3)->_AND($this->n64BAll);
                 if ($bitmap->is_zero()) {
                     $this->n64WhiteCastle->_OR($this->Tiles[2]);
                 }
             }
         }
     }
     if ($this->fCastleWKingside) {
         if (BitBoard::_AND_($this->n64All, $this->n64WhiteCastleKFree)->is_zero()) {
             $bitmap = $this->FindAttacksToTile(0, 5)->_AND($this->n64BAll);
             if ($bitmap->is_zero()) {
                 $bitmap = $this->FindAttacksToTile(0, 6)->_AND($this->n64BAll);
                 if ($bitmap->is_zero()) {
                     $this->n64WhiteCastle->_OR($this->Tiles[6]);
                 }
             }
         }
     }
     if ($this->fCastleBQueenside) {
         if (BitBoard::_AND_($this->n64All, $this->n64BlackCastleQFree)->is_zero()) {
             $bitmap = $this->FindAttacksToTile(7, 2)->_AND($this->n64WAll);
             if ($bitmap->is_zero()) {
                 $bitmap = $this->FindAttacksToTile(7, 3)->_AND($this->n64WAll);
                 if ($bitmap->is_zero()) {
                     $this->n64BlackCastle->_OR($this->Tiles[58]);
                 }
             }
         }
     }
     if ($this->fCastleBKingside) {
         if (BitBoard::_AND_($this->n64All, $this->n64BlackCastleKFree)->is_zero()) {
             $bitmap = $this->FindAttacksToTile(7, 5)->_AND($this->n64WAll);
             if ($bitmap->is_zero()) {
                 $bitmap = $this->FindAttacksToTile(7, 6)->_AND($this->n64WAll);
                 if ($bitmap->is_zero()) {
                     $this->n64BlackCastle->_OR($this->Tiles[62]);
                 }
             }
         }
     }
 }