我正在制作一个复杂的井字游戏程序,该程序具有可变的网格大小和播放器数量。但是我的一位朋友评论说,他们在以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]);
}