Example #1
0
        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;
            }
        }