2015-09-27 16 views
0

我有一個ConnectFour程序,它使用一個非常大的if語句來檢查是否有贏家,但它似乎只能在我的代碼的中間工作中使用tile(JButtons)。邊緣,而不是太多......如果你能看到我做錯了什麼,那麼如果這個狀態能起作用,那就太棒了!ConnectFour Win條件

源代碼:

import javax.swing.JPanel; 
import javax.swing.JButton; 
import java.awt.GridLayout; 
import java.awt.Color;  
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class ConnectFour extends JPanel 
{ 
    private int turn; 
    private final JButton BOARD[][]; 
    private final Color DEFAULT_COLOR; 

    public ConnectFour() 
    { 
     super(new GridLayout(6, 7)); 
     turn = 0; 

     BOARD = new JButton[6][7]; 
     HandlerClass handler = new HandlerClass(); 
     for(int i = 0; i < BOARD.length; i++) 
     { 
      for(int j = 0; j < BOARD[i].length; j++) 
      { 
       BOARD[i][j] = new JButton(""); 
       BOARD[i][j].addActionListener(handler); 
       if(!(i == BOARD.length - 1)) 
       { 
        BOARD[i][j].setEnabled(false); 
       } 
       add(BOARD[i][j]); 
      } 
     } 
     DEFAULT_COLOR = BOARD[0][0].getBackground(); 
    } 

public static void main(String[] args) 
{ 
    javax.swing.JFrame frame = new javax.swing.JFrame("test"); 
    frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
    frame.setSize(300, 300); 
    frame.setLocationRelativeTo(null); 
    frame.add(new ConnectFour()); 
    frame.setVisible(true); 
} 

private class HandlerClass implements ActionListener 
{ 
    public void actionPerformed(ActionEvent event) 
    { 
     JButton source = ((JButton) event.getSource()); 
     if(turn % 2 == 0) 
     { 
      source.setBackground(Color.RED); 
      source.setEnabled(false); 
     } 
     else 
     { 
      source.setBackground(Color.BLACK); 
      source.setEnabled(false); 
     } 

     boolean winner = checkWinner(); 

     if(winner) 
     { 
      System.out.println("Player " + (turn % 2 + 1) + " wins!"); 
     } 
     //--------------------------------- 
     for(int i = 0; i < BOARD.length; i++) 
     { 
      for(int j = 0; j < BOARD[i].length; j++) 
      { 
       if(BOARD[i][j].equals(source)) 
       { 
        try 
        { 
         BOARD[i - 1][j].setEnabled(true); 
         break; 
        } 
        catch(ArrayIndexOutOfBoundsException e) 
        { 
         //System.out.println("Hello, World!"); 
        } 
       } 
      } 
     } 
     turn++; 
    } 

    private boolean checkWinner() 
    { 
     for(int i = 0; i < BOARD.length; i++) 
     { 
      for(int j = 0; j < BOARD[i].length; j++) 
      { 
       try 
       { 
        if(((BOARD[i][j].getBackground().equals(BOARD[i + 1][j].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i + 2][j].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i + 3][j].getBackground())) 
        && !(BOARD[i][j].getBackground().equals(DEFAULT_COLOR))) 
        || ((BOARD[i][j].getBackground().equals(BOARD[i - 1][j].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i - 2][j].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i - 3][j].getBackground())) 
        && !(BOARD[i][j].getBackground().equals(DEFAULT_COLOR))) 
        || ((BOARD[i][j].getBackground().equals(BOARD[i][j + 1].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i][j + 2].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i][j + 3].getBackground())) 
        && !(BOARD[i][j].getBackground().equals(DEFAULT_COLOR))) 
        || ((BOARD[i][j].getBackground().equals(BOARD[i][j - 1].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i][j - 2].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i][j - 3].getBackground())) 
        && !(BOARD[i][j].getBackground().equals(DEFAULT_COLOR))) 
        || ((BOARD[i][j].getBackground().equals(BOARD[i + 1][j + 1].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i + 2][j + 2].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i + 3][j + 3].getBackground())) 
        && !(BOARD[i][j].getBackground().equals(DEFAULT_COLOR))) 
        || ((BOARD[i][j].getBackground().equals(BOARD[i + 1][j - 1].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i + 2][j - 2].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i + 3][j - 3].getBackground())) 
        && !(BOARD[i][j].getBackground().equals(DEFAULT_COLOR))) 
        || ((BOARD[i][j].getBackground().equals(BOARD[i - 1][j + 1].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i - 2][j + 2].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i - 3][j + 3].getBackground())) 
        && !(BOARD[i][j].getBackground().equals(DEFAULT_COLOR))) 
        || ((BOARD[i][j].getBackground().equals(BOARD[i - 1][j - 1].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i - 2][j - 2].getBackground())) 
        && (BOARD[i][j].getBackground().equals(BOARD[i - 3][j - 3].getBackground())) 
        && !(BOARD[i][j].getBackground().equals(DEFAULT_COLOR)))) 
         return true; 
       } 
       catch(ArrayIndexOutOfBoundsException e) 
       { 

       } 
      } 
     } 
     return false; 
    } 
} 

}

+0

這是我幾年前製作的Connect4 JavaScript玩具,然後在幾年後上傳。如果您在HTML上查看源代碼,則所有代碼都應位於https://googledrive.com/host/0B23IV_kQJJ8wb2piRTE5ZXhCV3M/中,如果您知道最後一個peice的位置,則可以檢查所有可能的運行。 –

回答

0

的原因,爲什麼你有這樣的錯誤是因爲你的代碼是很難在第一時間閱讀。你應該能夠解決這個沒有我們的幫助。雜亂的代碼意味着錯誤會在你身上蔓延。

一些評論:

1)添加Java到此篇涉及

2),而不是語言的 「i」 和 「j」 考慮使用 「高度」 和 「寬度」(或「 h「和」w「),因此作爲代碼的讀者,我可以知道這些變量指向哪個軸。

3)將每個(if)情況分成它自己的方法。你似乎知道如何使用方法,以便利用它們!讓你的代碼可讀,你會很快解決這個問題。

例如:

  if(((BOARD[i][j].getBackground().equals(BOARD[i + 1][j].getBackground())) 
      && (BOARD[i][j].getBackground().equals(BOARD[i + 2][j].getBackground())) 
      && (BOARD[i][j].getBackground().equals(BOARD[i + 3][j].getBackground())) 

我相信正在檢查的類似顏色的「垂直」或「水平」線(我不能說,因爲我不知道我和j)。那麼爲什麼不把它包裝在一個名爲「checkVertical」的方法中,該方法返回false的真實性。

4)學習如何使用調試器。他們非常容易使用,你可能會立即解決你的問題。