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;
        }