我正在制作国际象棋游戏,需要弄清楚如何移动棋子。我将我的部分存储在数组squaresGrid[][]
中,并且我想使用方法moveTo
移动部分。目前这种方法只是标记了一个选定的部分,但我需要它再次点击鼠标来选择移动所选部分的方块,但不确定如何最好地执行此操作。
public void actionPerformed(ActionEvent e)
{
for(int x = 0; x < 8; x++)
{
for(int y = 0; y < 8; y++)
{
if(e.getSource() == squaresGrid[x][y])
{
moveTo(e, squaresGrid[x][y]);
}
}
}
}
public void moveTo(ActionEvent e, JButton clicked)
{
clicked.setIcon(selected);
}
答案 0 :(得分:4)
你没有做“第二次actionPerformed
”。你做的是保持状态,当点击发生时,查看状态,并决定应采取的行动。
例如,保持名为currentlySelected
的字段,指向当前选定的方块(例如,包含其坐标)。
在actionPerformed
,当您收到点击时,请查看currentlySelected
。
currentlySelected
。currentlySelected
中取消选择并清除(置空)。currentlySelected
。如果它不合法,你可以做你认为正确的事情:也许取消选择原来的地方并选择新的地方。或者只是取消选择并告诉用户移动不合法。或者保持选择。请务必在适当的情况下始终清除currentlySelected
。
答案 1 :(得分:2)
您不需要第二个ActionListener或actionPerformed方法,而是需要一个 state-ful ActionListener,它知道按钮push是代表第一次推送还是第二次推送。布尔变量可以是此所需的全部内容。另一种选择是使用变量来表示第一个推送位置,最初将其设置为null,然后将其设置为等于第一次推送时的位置。在第二次推送检查它是否为null或非null并且如果为非null,则按钮push表示第二次推送。然后将其设置为null。
例如
public void actionPerformed(ActionEvent e) {
for(int x = 0; x < 8; x++) {
for(int y = 0; y < 8; y++) {
if(e.getSource() == squaresGrid[x][y]) {
if (gridLocation == null) {
// class to hold x and y location
gridLocation = new GridLocation(x, y);
} else {
// use gridLocation here
int firstX = gridLocation.getX();
int firstY = gridLocation.getY();
moveTo(e, x, y, firstX, firstY);
gridLocation = null;
}
}
}
}
}