我在基于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类。
不要使用==进行对象比较。 – BevynQ 2014-12-10 21:29:23
问题仍然存在.equals()。 – andrew1515 2014-12-10 21:39:50
_保留小混沌code_的确如此,_但是我希望有人可以帮助我,如果你不发布[MCVE](http://stackoverflow.com/help/mcve),可能性不大。我怀疑'=='上的'等于'将解决您的问题 – 2014-12-10 21:41:08