public int EvaluatePosition(Position position) { int score = 0; Bitboard notWhite = ~position.GetPieceBitboard(Position.WHITE, Position.ALL_PIECES); Bitboard notBlack = ~position.GetPieceBitboard(Position.BLACK, Position.ALL_PIECES); // King mobility int whiteKingSquare = Bitboards.BitScanForward(position.GetPieceBitboard(Position.WHITE, Position.KING)); int blackKingSquare = Bitboards.BitScanForward(position.GetPieceBitboard(Position.BLACK, Position.KING)); int whiteKing = Bitboards.CountBits(notWhite & Bitboards.KingBitboards[whiteKingSquare]); int blackKing = Bitboards.CountBits(notBlack & Bitboards.KingBitboards[blackKingSquare]); // Queen evalution int whiteQueen = EvaluateSlidingPiece(position, Position.WHITE, Position.QUEEN, 900, 1, ref notWhite); int blackQueen = EvaluateSlidingPiece(position, Position.BLACK, Position.QUEEN, 900, 1, ref notBlack); // Rook Evaluation int whiteRook = EvaluateSlidingPiece(position, Position.WHITE, Position.ROOK, 500, 3, ref notWhite); int blackRook = EvaluateSlidingPiece(position, Position.BLACK, Position.ROOK, 500, 3, ref notBlack); // Bishop Evaluation int whiteBishop = EvaluateSlidingPiece(position, Position.WHITE, Position.BISHOP, 325, 8, ref notWhite); int blackBishop = EvaluateSlidingPiece(position, Position.BLACK, Position.BISHOP, 325, 8, ref notBlack); // Knight Evaluation int whiteKnight = EvaluateKnights(position, Position.WHITE, 8, ref notWhite); int blackKnight = EvaluateKnights(position, Position.BLACK, 8, ref notBlack); // For now, do not include pawn mobility int whitePawn = 100 * Bitboards.CountBits(position.GetPieceBitboard(Position.WHITE, Position.PAWN)); int blackPawn = 100 * Bitboards.CountBits(position.GetPieceBitboard(Position.BLACK, Position.PAWN)); score = whitePawn + whiteKnight + whiteBishop + whiteRook + whiteQueen + whiteKing; score -= (blackPawn + blackKnight + blackBishop + blackRook + blackQueen + blackKing); if (position.PlayerToMove == Position.BLACK) { score *= -1; } return(score); }
public int EvaluatePosition(Position position) { int score = 0; Bitboard notWhite = ~position.GetPieceBitboard(Position.WHITE, Position.ALL_PIECES); Bitboard notBlack = ~position.GetPieceBitboard(Position.BLACK, Position.ALL_PIECES); // King mobility int whiteKingSquare = Bitboards.BitScanForward(position.GetPieceBitboard(Position.WHITE, Position.KING)); int blackKingSquare = Bitboards.BitScanForward(position.GetPieceBitboard(Position.BLACK, Position.KING)); int whiteKing = Bitboards.CountBits(notWhite & Bitboards.KingBitboards[whiteKingSquare]); int blackKing = Bitboards.CountBits(notBlack & Bitboards.KingBitboards[blackKingSquare]); // Queen evalution int whiteQueen = EvaluateSliders(ref position, Position.WHITE, Position.QUEEN); int blackQueen = EvaluateSliders(ref position, Position.BLACK, Position.QUEEN); // Rook Evaluation int whiteRook = EvaluateSliders(ref position, Position.WHITE, Position.ROOK); int blackRook = EvaluateSliders(ref position, Position.BLACK, Position.ROOK); // Bishop Evaluation int whiteBishop = EvaluateSliders(ref position, Position.WHITE, Position.BISHOP); int blackBishop = EvaluateSliders(ref position, Position.BLACK, Position.BISHOP); // Knight Evaluation int whiteKnight = EvaluateKnights(ref position, Position.WHITE); int blackKnight = EvaluateKnights(ref position, Position.BLACK); int whitePawn = EvaluatePawns(ref position, Position.WHITE); int blackPawn = EvaluatePawns(ref position, Position.BLACK); score = whitePawn + whiteKnight + whiteBishop + whiteRook + whiteQueen + whiteKing; score -= (blackPawn + blackKnight + blackBishop + blackRook + blackQueen + blackKing); if (position.PlayerToMove == Position.BLACK) { score *= -1; } return(score); }
public void CalculatesCorrectly() { Assert.AreEqual(Position.C1, Bitboards.BitScanForward(0x3789237839373920UL)); Assert.AreEqual(Position.H5, Bitboards.BitScanForward(0x3578900000000UL)); }