2012-12-29 48 views
1
public void floodFill(int x, int y) { 
    if (x >= 0 && x <= 9 && y >= 0 && y <= 9) { 
     if (mines[x][y] == 0) { 
      btn[x][y].setBackground(Color.GRAY); 
      floodFill(x - 1, y); 
      // floodFill(x + 1, y); 
      floodFill(x, y - 1); 
      // floodFill(x, y + 1); 
     } else { 
      return; 
     } 
    } 
} 

這是floodFill代碼,我用於掃雷式遊戲我正在使用。但是,正如你所看到的,2部分被註釋掉了。只要我取消註釋並運行程序。遞歸洪水溢出

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at sun.awt.NullComponentPeer.setBackground(Unknown Source) 
at java.awt.Component.setBackground(Unknown Source) 
at javax.swing.JComponent.setBackground(Unknown Source) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:95) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:99) 
at Minesweeper.BoardBuild.floodFill(BoardBuild.java:98) 

我不知道爲什麼會發生這種情況,我不確定如何解決它。任何幫助表示讚賞。

編輯:

是Fls'Zen聊天想出了,以防萬一別人的答案永遠有這個問題

public void floodFill(int x, int y) { 
    if (x >= 0 && x <= 9 && y >= 0 && y <= 9) { 
     if (mines[x][y] == 0 && btn[x][y].getBackground() != Color.GRAY) { 
      btn[x][y].setBackground(Color.GRAY); 
      floodFill(x - 1, y); 
      floodFill(x + 1, y); 
      floodFill(x, y - 1); 
      floodFill(x, y + 1); 
     } else { 
      return; 
     } 
    } 
} 
+0

1.增加堆棧大小 2.確保你沒有得到一個無限遞歸(我想記錄哪些字段已經用於測試) – MrSmith42

+0

爲了更好地幫助越早,張貼[SSCCE(HTTP:/ /sscce.org/)。 –

回答

4

當這些行被取消註釋時,您可以撥打x - 1x + 1的floodFill。考慮當你調用floodFill爲x - 1時會發生什麼。它還調用FloodFill的x + 1這是調用floodFill的x值。您有FloodFill自己調用相同的兩個x值,原始值x值和原始x - 1

如果你要使用遞歸,你應該選擇一個'方向'(+或 - )並堅持下去。否則,您需要添加一些內容來跟蹤哪些座標已經被評估。

編輯: 下面的代碼將避免當一個單元已經被算法處理時的遞歸。它通過檢查當前座標的背景顏色來完成此操作。如果背景已經是灰色的,那麼它假定它已經處理了座標並且不會再處理它們。

if (mines[x][y] == 0 && btn[x][y].getBackground() != Color.GRAY) { 
    btn[x][y].setBackground(Color.GRAY); 
    floodFill(x - 1, y); 
    floodFill(x + 1, y); 
    floodFill(x, y - 1); 
    floodFill(x, y + 1); 
} else { 
    return; 
} 
+0

@FlsZen,我將如何跟蹤它?我想到一個2D布爾數組默認設置爲false,它將鏡像按鈕,當它更改BG時,它將該值設置爲true。我會在哪裏檢查這個? – Exikle

+0

啊 - 你不檢查背景顏色。也許你應該在你的if語句中加入&& btn [x] [y] .getBackground()!= Color.GRAY'。 –

+0

@FlsZen到if(mines [x] [y] == 0)?我只是試圖「如果(礦井[x] [y] == 0 && btn [x] [y] .getBackground()== Color.GRAY)」並且它所做的只是灰色的我點擊。沒有別的 – Exikle

0

看起來不錄製該廣場你已經檢查過了,所以它在整個電路板上無限循環。