我正在制作一个复杂的井字游戏程序,该程序具有可变的网格大小和播放器数量。但是我的一位朋友评论说,他们在以64 x 64的空间移动时反应有些慢。我调查了一下,发现了问题,我的程序检查网格中的每个按钮以查看是否被单击,然后检查每个玩家以查看谁做出了此举。一旦找到两者,它就会随着生命继续前进:D。但是,在使用较大的网格时可能会花费一些时间。因此我尝试通过添加一些“中断”来修复它,但是他们没有帮助更快地找到它,只是停止了看起来更快。

public void actionPerformed(ActionEvent gridButtonClicked) {
        for (int i = 0; i < gridButton.length; i++) {
            if (gridButtonClicked.getSource() == gridButton[i]) {
                for(int a = 0;a < amountOfPlayers;a++){
                    if(turn == a) {
                        gridButtonOwner[i] = a + 1;
                        gridButton[i].setBackground(playerColors[a]);
                        gridButton[i].setEnabled(false);
                        System.out.println("Grid " + i + ": " + gridButtonOwner[i]);
                        break;
                    }
                }
                break;
            }
        }
    }


我想知道的是,是否可以单击按钮的阵列号。就像如果gridButtonClicked = gridButton [1],它将返回数字1,或者等于gridButton [2]将返回2,依此类推。


gridButtonOwner是一个int数组,
gridButton是一个jbutton数组。

最佳答案

我必须说我不了解循环的必要性。在第一个for循环中,您将获得网格按钮-但您知道这是什么,因为它是事件源...您只需将GridButton的映射存储到Integer即可在数组中获得位置。为什么循环找到它?在第二个循环中,您一直循环播放a == turn...。这意味着您已经知道a是什么了,因为它是== turn。您应该能够完全删除循环:

// earlier on: myMap = new HashMap<GridButton, Integer>();
public void actionPerformed(ActionEvent gridButtonClicked) {
    GridButton gridButton = gridButtonClicked.getSource();
    int i = myMap.get(gridButton);
    gridButtonOwner[i] = turn + 1;
    gridButton.setBackground(playerColors[turn]);
    gridButton.setEnabled(false);
    System.out.println("Grid " + i + ": " + gridButtonOwner[i]);
}

07-26 05:23