protected override bool TryPlacePiece(BoardState board, PieceDefinition piece, out PieceBitmap resultBitmap, out int resultX, out int resultY) { var holes = new List <int>(); int leastHoles = BoardState.Width * BoardState.Height; int largestHoleSize = 0; resultBitmap = null; resultX = -1; resultY = -1; //TODO: Distance could be < the piece size too for (var distance = 0; distance < BoardState.Width + BoardState.Height; distance++) { //TODO: Min(distance, Width - bitmap.MinSideSize) ? for (var x = 0; x <= distance; x++) { var y = distance - x; foreach (var bitmap in piece.PossibleOrientations) { if (x + bitmap.Width <= BoardState.Width && y + bitmap.Height <= BoardState.Height && board.CanPlace(bitmap, x, y)) { var clone = board; clone.Place(bitmap, x, y); holes.Clear(); PlacementHelper.HoleCount(clone, ref holes); //TODO: No Linq if (holes.Count < leastHoles || (holes.Count == leastHoles && holes.Max() > largestHoleSize)) { leastHoles = holes.Count; largestHoleSize = holes.Max(); resultBitmap = bitmap; resultX = x; resultY = y; } } } } if (resultBitmap != null) { return(true); } } return(false); }
private void TryPlacement(BoardState board, PieceBitmap bitmap, int x, int y, ref PieceBitmap resultBitmap, ref int resultX, ref int resultY, ref int bestLeastHoles, ref int bestLargestHole, ref int bestDistance, List <int> holes) { board.Place(bitmap, x, y); holes.Clear(); PlacementHelper.HoleCount(board, ref holes); //TODO: Remove LINQ var distance = x + y; //TODO: Try direct if (holes.Count < bestLeastHoles || (holes.Count == bestLeastHoles && holes.Max() > bestLargestHole) || (holes.Count == bestLeastHoles && holes.Max() == bestLargestHole && distance < bestDistance)) { bestLeastHoles = holes.Count; bestLargestHole = holes.Max(); bestDistance = distance; resultBitmap = bitmap; resultX = x; resultY = y; } }