private void ClearEmptyCells(GraphicsBalloon[,] board)
        {
            int row;
            int col;

            Queue<GraphicsBalloon> baloonsToPop = new Queue<GraphicsBalloon>();
            for (col = 7; col >= 0; col--)
            {
                for (row = 7; row >= 0; row--)
                {
                    if (!board[row, col].IsPopped)
                    {
                        baloonsToPop.Enqueue(board[row, col]);
                        board[row, col].Pop();
                    }
                }

                row = 7;
                while (baloonsToPop.Count > 0)
                {
                    board[row, col] = baloonsToPop.Dequeue();
                    board[row, col].Unpop();
                    Grid.SetRow(board[row, col], row);
                    Grid.SetColumn(board[row, col], col);
                    row--;
                }

                baloonsToPop.Clear();
            }
        }
        public void Pop(int row, int col, GraphicsBalloon[,] board)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }
            PopBalloons(row, col, board, board[row, col].Value, 8);

            ClearEmptyCells(board);
        }
        protected override void PopBalloons(int row, int col, GraphicsBalloon[,] board, int cellValue, int boardSize)
        {
            if ((row >= 0 && row < boardSize && col >= 0 && col < boardSize) &&
                board[row, col].Value == cellValue && !board[row, col].IsPopped)
            {
                board[row, col].Pop();

                PopBalloons(row - 1, col, board, cellValue, boardSize); // Up
                PopBalloons(row + 1, col, board, cellValue, boardSize); // Down
                PopBalloons(row, col + 1, board, cellValue, boardSize); // Left
                PopBalloons(row, col - 1, board, cellValue, boardSize); // Right
            }
        }
        protected override void PopBalloons(int row, int col, GraphicsBalloon[,] board, int cellValue, int boardSize)
        {
            int upperRow = row;
            int lowerRow = row;
            int leftCol = col;
            int rightCol = col;

            if (row > 0) upperRow--;
            if (row < boardSize - 1) lowerRow++;
            if (col > 0) leftCol--;
            if (col < boardSize - 1) rightCol++;

            for (int currentRow = upperRow; currentRow <= lowerRow; currentRow++)
            {
                for (int currentCol = leftCol; currentCol <= rightCol; currentCol++)
                {
                    board[currentRow, currentCol].Pop();
                }
            }
        }
 protected abstract void PopBalloons(int row, int col, GraphicsBalloon[,] board, int cellValue, int boardSize);