2014-12-10 42 views
-2

我在基于Swing JTable的扫雷中进行了回填洪水问题。在Java中使用递归进行填充

这是我的floodfill功能:

 public void floodfill(MouseEvent e, int row, int column) { 
      JTable target = (JTable)e.getSource(); 
      if (target.getValueAt(row, column) == this.getIconForValue(DataTable.getDataTableCellValue(row, column))) return; 
      target.setValueAt(this.getIconForValue(DataTable.getDataTableCellValue(row, column)), row, column); 

      if (row>0 && (DataTable.getDataTableCellValue(row-1, column)==0 || DataTable.getDataTableCellValue(row, column)==0)) 
       floodfill(e,row-1,column); 

      if (row>0 && column>0 && (DataTable.getDataTableCellValue(row-1, column-1)!=0 && DataTable.getDataTableCellValue(row, column)==0)) 
       floodfill(e,row-1,column-1); 

      if (column>0 &&  (DataTable.getDataTableCellValue(row, column-1)==0 || DataTable.getDataTableCellValue(row, column)==0)) 
       floodfill(e,row,column-1); 

      if (row<DataTable.getNumberOfRows()-1  && column>0 && (DataTable.getDataTableCellValue(row+1, column-1)!=0 || DataTable.getDataTableCellValue(row, column)==0)) 
       floodfill(e,row+1,column-1); 

      if (row<DataTable.getNumberOfRows()-1  &&  (DataTable.getDataTableCellValue(row+1, column)==0 || DataTable.getDataTableCellValue(row, column)==0)) 
       floodfill(e,row+1,column); 

      if (row<DataTable.getNumberOfRows()-1  && column<DataTable.getNumberOfCols()-1 && (DataTable.getDataTableCellValue(row+1, column+1)!=0 || DataTable.getDataTableCellValue(row, column)==0)) 
       floodfill(e,row+1,column+1); 

      if (column<DataTable.getNumberOfCols()-1 &&  (DataTable.getDataTableCellValue(row, column+1)==0 || DataTable.getDataTableCellValue(row, column)==0)) 
       floodfill(e,row,column+1); 

      if (row>0  &&  column<DataTable.getNumberOfCols()-1 && (DataTable.getDataTableCellValue(row-1, column+1)!=0 || DataTable.getDataTableCellValue(row, column)==0)) 
       floodfill(e,row-1,column+1); 

     } 

getIconForValue功能:

public ImageIcon getIconForValue(int value) { 
     ImageIcon icon = new ImageIcon("2.png"); 
     switch (value) { 
      case 0: 
       icon = new ImageIcon("0.png"); 
       break; 
      case 1: 
       icon = new ImageIcon("1.png"); 
       break; 
      case 2: 
       icon = new ImageIcon("2.png"); 
       break; 
      case 3: 
       icon = new ImageIcon("3.png"); 
       break; 
      case 4: 
       icon = new ImageIcon("4.png"); 
       break; 
      case 5: 
       icon = new ImageIcon("5.png"); 
       break; 
      case 6: 
       icon = new ImageIcon("6.png"); 
       break; 
      case 7: 
       icon = new ImageIcon("7.png"); 
       break; 
      case 8: 
       icon = new ImageIcon("8.png"); 
       break; 
      case 9: 
       icon = new ImageIcon("mine.png"); 
       break; 
     } 
     return icon; 
    } 

DataTable.java:

import java.util.Random; 
import javax.swing.ImageIcon; 

public class DataTable { 

private static int numberOfRows; 
private static int numberOfCols; 
private static int numberOfMines; 
private static Cell[][] dataTable; 

public static void createDataTable(int numberOfRowsX, int numberOfColsX, int numberOfMinesX) { 
    numberOfRows = numberOfRowsX; 
    numberOfCols = numberOfColsX; 
    numberOfMines = numberOfMinesX; 
    dataTable = new Cell[numberOfRows][numberOfCols]; 
    for (int i = 0;i < numberOfRows;i++) { 
     for (int j = 0; j < numberOfCols;j++) { 
      dataTable[i][j] = new NumberCell(); 
     } 
    } 
} 

public static void scatterMines() { 
    int rowCoordOfMine, colCoordOfMine; 
    Random randY = new Random(); 
    Random randX = new Random(); 

    for (int i = 1;i < numberOfMines+1;i++){ 
     do { 
      rowCoordOfMine = randY.nextInt(10)+0; 
      colCoordOfMine = randX.nextInt(15)+0; 
     } while(dataTable[rowCoordOfMine][colCoordOfMine].getValue() == 9); 
     dataTable[rowCoordOfMine][colCoordOfMine] = new MineCell(); 
    } 
} 

public static void increaseFieldValues() { 
    for (int i = 0;i < numberOfRows;i++) { 
     for (int j = 0;j < numberOfCols;j++) { 
      if (dataTable[i][j].getValue() == 9) { 
       if (i>0) { 
        if (dataTable[i-1][j].getValue() != 9) dataTable[i-1][j].increase(); 
       } 
       if ((i>0) && (j>0)) { 
        if (dataTable[i-1][j-1].getValue() != 9) dataTable[i-1][j-1].increase(); 
       } 
       if (j>0) { 
        if (dataTable[i][j-1].getValue() != 9) dataTable[i][j-1].increase(); 
       } 
       if ((i<9) && (j>0)) { 
        if (dataTable[i+1][j-1].getValue() != 9) dataTable[i+1][j-1].increase(); 
       } 
       if (i<9) { 
        if (dataTable[i+1][j].getValue() != 9) dataTable[i+1][j].increase(); 
       } 
       if ((i<9) && (j<9)) { 
        if (dataTable[i+1][j+1].getValue() != 9) dataTable[i+1][j+1].increase(); 
       } 
       if (j<9) { 
        if (dataTable[i][j+1].getValue() != 9) dataTable[i][j+1].increase(); 
       } 
       if ((i>0) && (j<9)) { 
        if (dataTable[i-1][j+1].getValue() != 9) dataTable[i-1][j+1].increase(); 
       } 
      } 
     } 
    } 
} 

public static int getDataTableCellValue(int rowCoord, int colCoord) { 
    return dataTable[rowCoord][colCoord].getValue(); 
} 

public static int getNumberOfRows() { 
    return numberOfRows; 
} 

public static int getNumberOfCols() { 
    return numberOfCols; 
} 

}

UserTable.java:

package java_hf; 
import java.util.Random; 
import javax.swing.ImageIcon; 

public class UserTable { 

    private static int numberOfRows; 
    private static int numberOfCols; 
    private static ImageIcon[][] userTable; 

    public static void createUserTable(int numberOfRowsX, int numberOfColsX) { 
     numberOfRows = numberOfRowsX; 
     numberOfCols = numberOfColsX; 
     userTable = new ImageIcon[numberOfRows][numberOfCols]; 
     for (int i = 0;i < numberOfRows;i++) { 
      for (int j = 0; j < numberOfCols;j++) { 
       userTable[i][j] = new ImageIcon("empty.png"); 
      } 
     } 
    } 

    public static ImageIcon[][] getUserTable() { 
     return userTable; 
    } 
} 

JTable基于带2D数组的DefaultTableModel,其中包含ImageIcons。 DataTable是一个类,它包含一个静态整数2D数组,其中包含雷区的数据(0-8 - >相邻单元上的矿井数量,9 - > mine)。 DataTable.getNumberOfCols()和DataTable.getNumberOfRows()函数返回DataTable数组中的列和行的数量。 getIconForValue()函数返回给定数字的ImageIcon。 最后,DataTable.getDataTableCellValue()返回DataTable数组中给定单元格的值。

这两个数组都填充了来自[0] [0]的内容。

问题是stackoverflowing。奇怪的是,我的C代码中的相同功能没有问题。

对不起,有点混乱的代码,但我希望有人能帮助我。谢谢!

更新:我添加了getIconValue函数和DataTable和UserTable类。

+0

不要使用==进行对象比较。 – BevynQ 2014-12-10 21:29:23

+0

问题仍然存在.equals()。 – andrew1515 2014-12-10 21:39:50

+0

_保留小混沌code_的确如此,_但是我希望有人可以帮助我,如果你不发布[MCVE](http://stackoverflow.com/help/mcve),可能性不大。我怀疑'=='上的'等于'将解决您的问题 – 2014-12-10 21:41:08

回答

0

不要每次都创建一个新的ImageIcon。 ==具有相同值的不同对象之间总是返回false。 ImageIcon没有实现equals,所以使用它会做同样的事情。

要么使用图像的静态实例,要么执行地图查找。

private static ImageIcon _0 = new ImageIcon("0.png"); 

public ImageIcon getIconForValue(int value) { 
    ImageIcon icon; 
    switch (value) { 
     case 0: 
      icon = _0; 
      break; 
     ... 
     default: 
      icon = _2; 
      break; 
    } 
    return icon; 
} 

public ImageIcon getIconForValue(int value) { 
    ImageIcon icon = iconMap.get(value); 
    if(icon == null){ 
     icon = new ImageIcon(value+".png"); 
     iconMap.put(value,icon); 
    } 
    return icon; 
}