2015-11-30 41 views
-2
import java.util.Random; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.JOptionPane; 

public class StartGame 
{ 
    private JFrame frame; 
    private JPanel panel; 
    private JButton[][] button = new JButton[9][9]; 
    private int[][] status = new int[9][9]; 

    public StartGame() 
    { 
     frame = new JFrame(); 
     frame.setTitle("MineSweeper"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500, 500); 

     panel = new JPanel(); 
     panel.setLayout(new GridLayout(9, 9)); 
     for (int i = 0; i < button.length; i++) 
     { 
     for (int j = 0; j < button.length; j++) 
     { 
      button[i][j] = new JButton(""); 
      panel.add(button[i][j]); 
      status[i][j] = 0; 
      button[i][j].addActionListener(new ButtonListener()); 
     } 
     } 

     setMine(); 

     frame.add(panel); 
     frame.setVisible(true); 

    } 

    public void setMine() 
    { 
     Random randomNumber = new Random(); 
     for (int i = 0; i < 10; i++) 
     { 
     int x = randomNumber.nextInt(9); 
     int y = randomNumber.nextInt(9); 
     if (status[x][y] != 1) 
     { 
      status[x][y] = 1; 
     } 
     else 
     { 
      i--; 
     } 
     } 
    } 

    public class ButtonListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
     for (int x = 0; x < button.length; x++) 
     { 
      for (int y = 0; y < button.length; y++) 
      { 
       if (e.getSource() == button[x][y]) 
       { 
        if (status[x][y] == 0) 
        { 
        ButtonChange(x, y); 
        } 
        else 
        { 
        JOptionPane.showMessageDialog(null ,"YOU LOSS"); 
        } 
       } 
      } 
     } 
     }  
    } 

    public void ButtonChange(int x, int y) 
    { 
     if (x >= 0 && y >= 0 && x < button.length && y < button.length) 
     { 
     int num = 0; 
     if (status[x][y] == 0) 
     { 
      num += CheckMine(x-1, y-1); 
      num += CheckMine(x, y-1); 
      num += CheckMine(x+1, y-1); 
      num += CheckMine(x-1, y); 
      num += CheckMine(x+1, y); 
      num += CheckMine(x-1, y+1); 
      num += CheckMine(x, y+1); 
      num += CheckMine(x+1, y+1); 
     } 

     if (num == 0) 
     { 
      button[x][y].setEnabled(false); 
      ButtonChange(x, y-1); 
      ButtonChange(x, y+1); 
      ButtonChange(x-1, y); 
      ButtonChange(x+1, y); 
     } 
     else 
     { 
      button[x][y].setEnabled(false); 
      button[x][y].setText(Integer.toString(num)); 
     } 
     } 
    } 

    public int CheckMine(int x, int y) 
    { 
     int num = 0; 
     if (x >= 0 && y >= 0 && x < button.length && y < button.length) 
     { 
     if (status[x][y] == 1) 
     { 
      num = 1; 
     } 
     } 
     return num; 
    } 
} 

這是我的代碼,我還沒有還完,因爲我還沒有做檢查贏得了方法的錯誤。 主程序在另一個類中。當我嘗試點擊按鈕的一些我儘量讓實踐掃雷艇,但我得到了,我不明白爲什麼

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at javax.swing.JComponent.disable(JComponent.java:3638) 
at java.awt.Component.enable(Component.java:1517) 
at java.awt.Component.setEnabled(Component.java:1480) 
at javax.swing.JComponent.setEnabled(JComponent.java:2680) 
at javax.swing.AbstractButton.setEnabled(AbstractButton.java:2091) 
at StartGame.ButtonChange(StartGame.java:104) 
at StartGame.ButtonChange(StartGame.java:103) 

: 我得到了一個錯誤。 我不明白爲什麼,因爲我檢查它,它似乎是正確的。 它沒有在ButtonChange函數中僅適用於上下按鈕更改,而不適用於左右。我只是沒有得到什麼發生在我的程序.....

+1

這不是一個錯誤消息。請發佈完整的錯誤消息。 – Coderchu

+0

請告訴我們錯誤信息(即上面的線'在StartGame.Button ...) – Roberto

+0

關於「AWT-EventQueue的 - 0」 java.lang.StackOverflowError的 \t在javax.swing.JComponent中說 異常螺紋遺憾。禁用(JComponent.java:3638) \t在java.awt.Component.enable(Component.java:1517) \t在java.awt.Component.setEnabled(Component.java:1480) \t在javax.swing.JComponent中.setEnabled(JComponent.java:2680) \t at javax.swing.AbstractButton.setEnabled(AbstractButton。java:2091) –

回答

1

問題是,你有一個按鈕矩陣,你想setEnabled(假)整個矩陣...你必須setEnable每個按鈕明確...

嘗試禁用兩個for循環像

for(int i = 0; i<9; i++){ 
    for(int j = 0 ; j<9; j++){ 
    button[i][j].setEnabled(false); 
    } 
} 

編輯:

這不是問題......問題是由於您對遞歸性使用不當引起的......方法ButtonChange本身被調用得太深了......讓我們假設第一個調用的參數是(2, 2)...該方法將自己調用(2,1),然後用(2,0),然後(2,-1),然後用(2,3)並且再次用(2,2)開始,然後2,1)...因此,這使得出現stackOverFlow錯誤

如果你把一個System.out.println(「X =」+ X +「和Y =」+ Y);在方法的第一行,然後再試一次,你會看到這個問題...

UPDATE:

的問題是在你的方法將ButtonChange(INT X,int y)對,因爲在那裏你遞歸調用該方法的參數創建一個無限的呼叫...讓我告訴你一個例子,以便讓我明白

遞歸的一個例子是斐波那契的系列...我可以創造下一個代碼,找出在某些時候是意甲值:

public int fibonacci(int value){ 
    if(value == 1 || value == 2){ 
     return 1; 
    }else{ 
     return fibonacci(value-1)+fibonacci(value-2); 
    } 
} 

如果我想知道與價值的意甲= 4的值:

fibonacci(4)=3

但查了下代碼:

public int fibonacci(int value){ 
    if(value == 1 || value == 2 || value > 8){ 
     return 1; 
    }else{ 
     return fibonacci(value-1)+fibonacci(value+1); 
    } 
} 

檢查入法我「值1」和「價值+ 1」

遞歸調用的方法

現在,如果我想知道與價值的意甲= 4的值:

f(4)=Error

在這一點上,如果你仔細看,我們有F(3)= F(2)+ ˚F (4) AND f(5)= f(4) + f(6)如果您還記得f(4)是函數的初始值,所以這意味着現在原函數出現在迭代。這不僅使得每次調用該方法的遞歸更大,而且從來沒有迭代會結束......所以最終會產生一個java.lang.StackOverFlow錯誤

這是一個類似的行爲,你在你的函數ButtonChange當你在函數裏面做

ButtonChange(x,y-1);
ButtonChange(x,y + 1);
ButtonChange(x-1,y);
ButtonChange(x + 1,y);

+0

我不太明白,因爲按鈕[x] [y]中的x和y是由 給出的值public void ButtonChange(int x,int y) 所以我想它應該是一個只有特定的按鈕 –

+0

你說得對,我沒有看,那不是問題... 問題是由於你使用遞歸性不好引起的...... ButtonChange方法本身被調用得太深... 假設第一個調用的參數是(2,2)... 該方法將自己調用(2,1),然後調用(2,0),然後(2,-1 )然後用(2,3)並且再次用(2,2)然後(2,1)...開始......這樣就會出現stackOverFlow錯誤......如果您在代碼中進行調試,您會看到;) – Dazak

+0

但它是如何工作的不是嗎?如果您點擊的是您附近的零礦,那麼系統應該點擊該按鈕周圍的那個。最後,它會看起來像一個點擊大面積,那麼你可以猜測地雷是在哪裏 –

0

看起來你無限期地用遞歸跳躍左右。這將足以增加關於電池的狀態信息(發現/未發現):

private Boolean[][] checked = new Boolean[9][9]; 

或使用按鈕狀態。然後修改的主要條件:

if (x >= 0 && y >= 0 && x < button.length && y < button.length && !checked[x][y]) 

if (x >= 0 && y >= 0 && x < button.length && y < button.length && !button[x][y].isEnabled()) 

那麼它應該工作。

相關問題