Score Evaluator::calculateMaterialScore(const Position& position) const { Score score = Score::zero(); auto& blackHand = position.getBlackHand(); score += material::Pawn * blackHand.get(PieceType::pawn ()); score += material::Lance * blackHand.get(PieceType::lance ()); score += material::Knight * blackHand.get(PieceType::knight()); score += material::Silver * blackHand.get(PieceType::silver()); score += material::Gold * blackHand.get(PieceType::gold ()); score += material::Bishop * blackHand.get(PieceType::bishop()); score += material::Rook * blackHand.get(PieceType::rook ()); auto& whiteHand = position.getWhiteHand(); score -= material::Pawn * whiteHand.get(PieceType::pawn ()); score -= material::Lance * whiteHand.get(PieceType::lance ()); score -= material::Knight * whiteHand.get(PieceType::knight()); score -= material::Silver * whiteHand.get(PieceType::silver()); score -= material::Gold * whiteHand.get(PieceType::gold ()); score -= material::Bishop * whiteHand.get(PieceType::bishop()); score -= material::Rook * whiteHand.get(PieceType::rook ()); Bitboard occ = nosseOr(position.getBOccupiedBitboard(), position.getWOccupiedBitboard()); occ.unset(position.getBlackKingSquare()); occ.unset(position.getWhiteKingSquare()); BB_EACH(square, occ) { auto piece = position.getPieceOnBoard(square); if (piece.isBlack()) { score += material::score(piece); } else { score -= material::score(piece); } }
Bitboard SEE::extractAttackers(const Position& position, Square from, Square to) { Bitboard occ = nosseOr(position.getBOccupiedBitboard(), position.getWOccupiedBitboard()); RotatedBitboard occ90 = position.get90RotatedBitboard(); RotatedBitboard occR45 = position.getRight45RotatedBitboard(); RotatedBitboard occL45 = position.getLeft45RotatedBitboard(); occ.unset(from); occ90.unset(from.rotate90()); occR45.unset(from.rotateRight45()); occL45.unset(from.rotateLeft45()); Bitboard bb = Bitboard::zero(); bb |= (Bitboard::mask(to) << 1) & position.getBPawnBitboard(); bb |= (Bitboard::mask(to) >> 1) & position.getWPawnBitboard(); bb |= MoveTables::whiteLance(occ, to) & position.getBLanceBitboard(); bb |= MoveTables::blackLance(occ, to) & position.getWLanceBitboard(); bb |= MoveTables::whiteKnight(to) & position.getBKnightBitboard(); bb |= MoveTables::blackKnight(to) & position.getWKnightBitboard(); bb |= MoveTables::whiteSilver(to) & position.getBSilverBitboard(); bb |= MoveTables::blackSilver(to) & position.getWSilverBitboard(); bb |= MoveTables::whiteGold(to) & position.getBGoldBitboard(); bb |= MoveTables::blackGold(to) & position.getWGoldBitboard(); bb |= (MoveTables::ver(occ, to) | MoveTables::hor(occ90, to)) & (position.getBRookBitboard() | position.getBDragonBitboard() | position.getWRookBitboard() | position.getWDragonBitboard()); bb |= (MoveTables::diagR45(occR45, to) | MoveTables::diagL45(occL45, to)) & (position.getBBishopBitboard() | position.getBHorseBitboard() | position.getWBishopBitboard() | position.getWHorseBitboard()); bb |= MoveTables::king(to) & (position.getBDragonBitboard() | position.getWDragonBitboard()); // TODO: king bb.unset(from); return bb; }