private void destroyWalls() {
        final int rows, columns, zombiesNeededToBreakDownAWall;
        final double cellWidth, cellHeight;
        double cellXMin, cellYMin, cellXMax, cellYMax;
        EnvironmentCell cell;
        Collection<EnvironmentWall> cellWalls;
        Line2D destroyedPart;
        
        rows                          = this.configuration.getEnvironment().getNumberOfRows();
        columns                       = this.configuration.getEnvironment().getNumberOfColumns();
        cellWidth                     = this.configuration.getEnvironment().getCellWidth();
        cellHeight                    = this.configuration.getEnvironment().getCellHeight();
        zombiesNeededToBreakDownAWall = this.configuration.getResources().getWall().getZombiesNeededToBreakDownAWall();
    
        //Look for cells containing the minimum number of zombies
        for(int row = 0; row < rows; row++) {
            for(int column = 0; column < columns; column++) {
                cell = this.environment[row][column];
                
                if(cell.getNumberOfZombies() >= zombiesNeededToBreakDownAWall 
                   && cell.getNumberOfDestructibleWalls() > 0) {
                    
                    cellWalls = cell.getDestructibleWalls();
                    cellXMin  = column * cellWidth;
                    cellXMax  = Math.nextAfter(cellXMin + cellWidth, Double.NEGATIVE_INFINITY);
                    cellYMin  = row * cellHeight;
                    cellYMax  = Math.nextAfter(cellYMin + cellHeight, Double.NEGATIVE_INFINITY);
                    
                    synchronized(cellWalls) {
                        //For each wall that crosses the cell, destroy the crossing part
                        for(EnvironmentWall cellWall: cellWalls) {
                            //Calculate the part that will be destroyed
                            destroyedPart = GeometryUtils.clipLine(cellXMin, cellYMin, cellXMax, cellYMax,
                                                                   cellWall.x1, cellWall.y1, cellWall.x2, cellWall.y2);
                            
                            //Destroy the crossing part of the wall
                            if(destroyedPart != null) {
                                this.destroyWall(cellWall, destroyedPart);
                            }
                        }
                        
                        cellWalls.clear();
                    }
                }
            }
        }
    }