如何围绕二维数组中的特定按钮循环

时间:2017-04-04 19:36:36

标签: java arrays for-loop

我有这个forloop,用2d数组创建网格布局中的按钮

public Board(){
  gameBoard = new JPanel(new GridLayout(8,8));
  array = new JButton[8][8];

  int limit = 8;
  for(int i = 0; i< limit; i++){
      for(int t = 0; t< limit; t++){
       JButton button = new JButton("");
       gameBoard.add(button);
       array[i][t] = button;   
       array[i][t].addActionListener(e -> newMethod(e));
    }
  }

我也有这种方法,理想情况下应该循环按钮,当它点击并根据条件更改周围的按钮,但我不知道如何循环点击特定按钮。有关如何执行此操作的任何提示

 public void newMethod(ActionEvent e){
   JButton b = (JButton) e.getSource();
    gameLogic(b);
    BPlayer = !BPlayer;
    System.out.println(BPlayer); 
    System.out.println(b);

}

 public void gameLogic(JButton b){
 int limit = 8;
 // Black Players Turn
 if(BPlayer && b.getText().equals("") ){
  b.setText("B");
      for(int i = 0; i< limit; i++){
      for(int t = 0; t< limit; t++){
       if(array[i][t].getText().equals("W")){
          b.setText("B");
         }
            else if(array[i][t].getText().equals("B")){
             //do nothing 
            }
            else if(array[i][t].getText().equals("")){
                // do nothing like everything else 
            }

    }
  }     
}

1 个答案:

答案 0 :(得分:0)

要循环按钮,您需要能够确定游戏板上按钮的位置。一种方法是将按钮的坐标存储在按钮中:

private final static String POS_KEY = "btnPosKey";

Board() {
    ...
        button.putClientProperty(POS_KEY, new int[]{i, t});
    ...
}

然后,您的游戏逻辑可以检索从按钮本身单击的按钮的坐标:

void gameLogic(JButton b) {
    int[] pos = (int[]) b.getClientProperty(POS_KEY);
    int i = pos[0], t = pos[1];

在按钮周围循环就像在小的3x3方格上迭代一样简单,以(i,t)坐标为中心。

    for(int di = i - 1;  di <= i + 1;  di++) {
        for (int dt = t - 1; dt <= t + 1;  dt++) {

但是你不想超越游戏网格的界限......

            if ( di >= 0  &&  di < limit   &&   dt >= 0  &&  dt < limit ) {

或者可能包含中心按钮......

                if (di != i  || dt != t) {
                    array[di][dt].setText("B");
                }
            }
        }
    }

当然,还有其他方法可以确定按钮的坐标,而不是使用putClientProperty()存储它:

  • JButton派生您自己的班级,并将坐标存储为字段。
  • 使用it作为e -> newMethod(e, fi, ft) lambda的fift坐标,作为final的{​​{1}}副本1}}和i变量。
  • t按钮中搜索按钮以确定坐标。

使用最方便的方法。