private double GetScore(List<IPiece> playerPieces, Board board) { Dictionary<short, short> pawnCoords = new Dictionary<short, short>(); Double score = 0; foreach (var pc in playerPieces) { switch (pc.PieceType) { case PieceType.Queen: score += queenMaterial; score += queenKingProximity * (7 - GetChebyShevDistance(pc.Location, board.GetKingPosition(board.OpposingPlayer()))); score += queenCenterProximity * (3 - GetChebyShevDistance(pc.Location, board.GetCenter())); break; case PieceType.Bishop: score += bishopMaterial; score += bishopDistanceToCenterWeight * (4 - GetChebyShevDistance(pc.Location, board.GetCenter())); // mobility and xray mobility break; case PieceType.Knight: score += knightMaterial; score += knightDistanceToKingWeight * GetManhattanDistance(pc.Location, board.GetKingPosition(board.OpposingPlayer())); score += knightDistanceToKingWeight * GetManhattanDistance(pc.Location, board.GetKingPosition(board.PlayerTurn)); score += knightDistanceToCenterWeight * (4 - GetChebyShevDistance(pc.Location, board.GetCenter())); break; case PieceType.Rook: score += rookMaterial; score += rookKingProximity * (14 - GetManhattanDistance(pc.Location, board.GetKingPosition(board.OpposingPlayer()))); //mobility and xray mobility // friendly pawns. break; case PieceType.Pawn: score += pawnMaterial; score += pawnRankWeight * pc.Rank; if (pawnCoords.ContainsKey(pc.Location.X)) { pawnCoords[pc.Location.X] = Math.Min(pc.Location.Y, pawnCoords[pc.Location.X]); score -= doubledPawnPenalty; } else { pawnCoords.Add(pc.Location.X, pc.Location.Y); } break; } } score += IsolatedPawns(pawnCoords); return score; }
public double Evaluate(Board board) { Double score = 0; var playerPieces = board.GetPiecesForPlayer(board.PlayerTurn); var opposingPieces = board.GetPiecesForPlayer(board.OpposingPlayer()); score = GetScore(playerPieces, board); score -= GetScore(opposingPieces, board); //score = 200 * (CountPiecesByType(playerPieces, PieceType.King) - CountPiecesByType(opposingPieces, PieceType.King)); //score += 9 * (CountPiecesByType(playerPieces, PieceType.Queen) - CountPiecesByType(opposingPieces, PieceType.Queen)); //score += 5 * (CountPiecesByType(playerPieces, PieceType.Rook) - CountPiecesByType(opposingPieces, PieceType.Rook)); //score += 3 * ((CountPiecesByType(playerPieces, PieceType.Bishop) - CountPiecesByType(opposingPieces, PieceType.Bishop)) + // (CountPiecesByType(playerPieces, PieceType.Knight) - CountPiecesByType(opposingPieces, PieceType.Knight))); //score += 1 * (CountPiecesByType(playerPieces, PieceType.Pawn) - (CountPiecesByType(opposingPieces, PieceType.Pawn))); //score -= .5 * ((DoubledPawns(playerPieces) - DoubledPawns(opposingPieces)) + // (BlockedPawns(playerPieces) - BlockedPawns(opposingPieces)) + // (IsolatedPawns(playerPieces) - IsolatedPawns(opposingPieces))); //score += .1 * (CountMoves(board, playerPieces) - CountMoves(board, opposingPieces)); return score; }