我在基於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