2014-12-19 88 views
-3

我一直在嘗試編寫「Lights Out」遊戲並對遊戲及其機制進行了編碼。我唯一的問題是每個難題都無法解決的問題。我試圖編寫一種方法來檢查它爲解決問題而創建的難題,但是當我運行遊戲時,現在什麼都沒有顯示出來。遊戲永遠不會運行。我相信它卡在checkValidity()方法的某個地方,但我不知道在哪裏。任何幫助?「熄燈」有效性檢查

import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import javax.swing.UIManager; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.GridLayout; 
import java.awt.Dimension; 
import java.awt.Color; 

import java.util.Random; 

public class buildBoard { 
    public static JButton[][] board = new JButton[5][5]; 
    public static boolean[][] color = new boolean[5][5];; 
    JFrame frame = new JFrame(); 

    public static UIManager UIManager = new UIManager(); 

    public static int boardWidth, boardHeight, numBlack, moves = 0; 

    public static String bottomRow = ""; 
    public static boolean isSolvable = false; 

    public buildBoard(final int width, final int height){ 

     boardWidth = width; 
     boardHeight = height; 

     frame.setLayout(new GridLayout(5, 5)); 

     boolean[][] color = new boolean[boardWidth][boardHeight]; 

     for(int a = 0; a < width; a++){ 
      for(int b = 0; b < height; b++){ 
       board[a][b] = new JButton(); 
      } 
     } 
     generateLights(); 
     while(isSolvable == false){ 
     generateLights(); 
     checkValidity(); 
     if(isSolvable == false){ 
       for(int c = 0; c < boardWidth; c++){ 
        for(int d = 0; d < boardHeight; d++){ 
         color[c][d] = false; 
        } 
       } 
      } 
     } 
     for(int a = 0; a < width; a++){ 
      for(int b = 0; b < height; b++){  
       board[a][b].addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         moves++; 
         for (int i = 0; i < width; i++) { 
          for (int j = 0; j < height; j++){ 
           if(e.getSource()==board[i][j]){ //gameButtons[i][j] was clicked 
            if(board[i][j].getBackground() == Color.BLUE){ 
             board[i][j].setBackground(Color.BLACK); 
            } 
            else{ 
             board[i][j].setBackground(Color.BLUE); 
            } 
            if(j > 0 && (board[i][j-1].getBackground() == Color.BLUE)){ 
             board[i][j-1].setBackground(Color.BLACK); 
            } 
            else if(j > 0){ 
             board[i][j-1].setBackground(Color.BLUE); 
            } 
            if(i > 0 && board[i-1][j].getBackground() == Color.BLUE){ 
             board[i-1][j].setBackground(Color.BLACK); 
            } 
            else if (i > 0){ 
             board[i-1][j].setBackground(Color.BLUE); 
            } 
            if(i < width-1 && board[i+1][j].getBackground() == Color.BLUE){ 
             board[i+1][j].setBackground(Color.BLACK); 
            } 
            else if(i < width-1){ 
             board[i+1][j].setBackground(Color.BLUE); 
            } 
            if(j < height-1 && board[i][j+1].getBackground() == Color.BLUE){ 
             board[i][j+1].setBackground(Color.BLACK); 
            } 
            else if(j < height-1){ 
             board[i][j+1].setBackground(Color.BLUE); 
            } 
            checkIfWon(); 
           } 
          } 
         } 
        } 
       }); 
      try { 
       UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
      } catch (Exception e) { } 
      frame.add(board[a][b]); 
     } 
    } 

    frame.setTitle("Lights Out!"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setMinimumSize(new Dimension(250, 250)); 
    frame.pack(); 
    frame.setVisible(true); 

} 

public void checkIfWon(){ 
    int numBlack = 0; 
    for(int i = 0; i < boardWidth; i++){ 
     for(int j = 0; j < boardHeight; j++){ 
      if(board[i][j].getBackground() == Color.BLACK){ 
       numBlack++; 
      } 
     } 
    } 
    if(numBlack == 25){ 
     JOptionPane.showMessageDialog(null, "Hooray! You Won!\nYou won in " + moves + " moves."); 
     System.exit(0); 
    } 
} 

public static void checkValidity(){  
    for(int j = 0; j < boardHeight - 1; j++){ 
     for(int i = 0; i < boardWidth; i++){ 
      if(color[i][j] == true){ 
       if(color[i][j] == true){ 
        color[i][j] = false; 
       } 
       else{ 
        color[i][j] = true; 
       } 
       if(j > 0 && color[i][j+1] == true){ 
        color[i][j+1] = false; 
       } 
       else if(j > 0){ 
        color[i][j+1] = true; 
       } 
       if(i > 0 && color[i-1][j+1] == true){ 
        color[i-1][j+1] = false; 
       } 
       else if (i > 0){ 
        color[i-1][j+1] = true; 
       } 
       if(i < boardWidth-1 && color[i+1][j+1] == true){ 
        color[i+1][j+1] = false; 
       } 
       else if(i < boardWidth-1){ 
        color[i+1][j+1] = true; 
       } 
       if(j < boardHeight-2 && color[i][j+2] == true){ 
        color[i][j+2] = false; 
       } 
       else if(j < boardHeight-2){ 
        color[i][j+2] = true; 
       } 
      } 
     } 
    } 
    for(int c = 0; c < boardWidth; c++){ 
     if(color[4][c] == true){ 
      bottomRow += "1"; 
     } 
     else{ 
      bottomRow += "0"; 
     } 
    } 
    if(bottomRow.equals("10001") || bottomRow.equals("01010") || bottomRow.equals("11100") || bottomRow.equals("00111") || bottomRow.equals("10110") || bottomRow.equals("01101") || bottomRow.equals("11011")){ 
     isSolvable = true; 
    } 
    else{ 
     isSolvable = false; 
    } 
} 

public static void generateLights(){ 
    Random random = new Random(); 

    for(int a = 0; a < boardWidth; a++){ 
     for(int b = 0; b < boardHeight; b++){ 
      if(random.nextInt(99)+1 > 75){ 
       board[a][b].setBackground(Color.BLUE); 
       color[a][b] = true; 
      }else{ 
       board[a][b].setBackground(Color.BLACK); 
       color[a][b] = false; 
      } 
     } 
    } 
} 

    public static void main(String []args){ 
     new buildBoard(5, 5); 
    } 
} 

的checkValidity()方法的問題,並張貼在這裏(該方法的代碼剩下的就是上面,以防萬一):

public static void checkValidity(){  
    for(int j = 0; j < boardHeight - 1; j++){ 
     for(int i = 0; i < boardWidth; i++){ 
      if(color[i][j] == true){ 
       if(color[i][j] == true){ 
        color[i][j] = false; 
       } 
       else{ 
        color[i][j] = true; 
       } 
       if(j > 0 && color[i][j+1] == true){ 
        color[i][j+1] = false; 
       } 
       else if(j > 0){ 
        color[i][j+1] = true; 
       } 
       if(i > 0 && color[i-1][j+1] == true){ 
        color[i-1][j+1] = false; 
       } 
       else if (i > 0){ 
        color[i-1][j+1] = true; 
       } 
       if(i < boardWidth-1 && color[i+1][j+1] == true){ 
        color[i+1][j+1] = false; 
       } 
       else if(i < boardWidth-1){ 
        color[i+1][j+1] = true; 
       } 
       if(j < boardHeight-2 && color[i][j+2] == true){ 
        color[i][j+2] = false; 
       } 
       else if(j < boardHeight-2){ 
        color[i][j+2] = true; 
       } 
      } 
     } 
    } 
    for(int c = 0; c < boardWidth; c++){ 
     if(color[4][c] == true){ 
      bottomRow += "1"; 
     } 
     else{ 
      bottomRow += "0"; 
     } 
    } 
    if(bottomRow.equals("10001") || bottomRow.equals("01010") || bottomRow.equals("11100") || bottomRow.equals("00111") || bottomRow.equals("10110") || bottomRow.equals("01101") || bottomRow.equals("11011")){ 
     isSolvable = true; 
    } 
    else{ 
     isSolvable = false; 
    } 
} 

public static void generateLights(){ 
    Random random = new Random(); 

    for(int a = 0; a < boardWidth; a++){ 
     for(int b = 0; b < boardHeight; b++){ 
      if(random.nextInt(99)+1 > 75){ 
       board[a][b].setBackground(Color.BLUE); 
       color[a][b] = true; 
      }else{ 
       board[a][b].setBackground(Color.BLACK); 
       color[a][b] = false; 
      } 
     } 
    } 
} 
+1

使用一個調試器或分析器來確定它被卡住的位置(例如,只需要運行一段時間調試器,然後暫停它,看看堆棧在哪裏)。我猜想它會在某個地方陷入無限循環。 – lmm

+0

您可以在其中放置跟蹤代碼,以更改窗口上的標題,以便知道停止的位置。 – idstam

+1

請優化您的問題以指出您的代碼中最相關的部分。 –

回答

0

的問題確實是在你的合法性檢查,特別是在你的底線是永不有效。

第一次運行時,你生成一個5個字符的字符串,它是無效的,然後你再次啓動,但你永遠不會重置該字符串,而是繼續追加它,使其不斷增長。我修改你的程序輸出的每個底排它檢查,這是我所得到的...

Checking bottom row: 00001 
Checking bottom row: 0000100000 
Checking bottom row: 000010000000000 
Checking bottom row: 00001000000000000000 
Checking bottom row: 0000100000000000000000000 
Checking bottom row: 000010000000000000000000000000 
Checking bottom row: 00001000000000000000000000000000001 

您需要重置數據結構,當你重新董事會是空的。

作爲一種風格,過度使用類級別的變量會傷害您的調試能力,因此您應該儘量保持數據在本地的可用性。例如,放棄使用靜態變量並改變實例變量,讓你的方法返回數據而不是僅僅設置它

+0

我試圖在循環之前和調用方法之前添加bottomRow的重置,但沒有更改。謝謝你的風格提示,但由於某種原因,我似乎總是有退貨問題。 –

+0

沒有重置,從來沒有一個點產生進一步的序列。 bottomRow變量永遠不會在方法外部讀取,所以擺脫公共靜態字符串bottomRow =「」;而是在第一次使用它的checkValidity方法中包含String bottomRow =「」。這不會完全解決您的問題,因爲您在該方法內的實際邏輯中也存在問題 – tddmonkey

+0

特別是您的checkValidity方法正在修改它應該檢查的數據,因此無論您的顏色數組中有什麼值,它會切換到[false,false,false,false,false]或[false,false,false,false,true] - 它永遠不會產生正確的序列。不知道你究竟在做什麼,我將無法提供更多的幫助 – tddmonkey