如何采取第二个动作执行移动棋子?

时间:2015-02-27 12:40:09

标签: java swing chess

我正在制作国际象棋游戏,需要弄清楚如何移动棋子。我将我的部分存储在数组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);
    }

2 个答案:

答案 0 :(得分:4)

你没有做“第二次actionPerformed”。你做的是保持状态,当点击发生时,查看状态,并决定应采取的行动。

例如,保持名为currentlySelected的字段,指向当前选定的方块(例如,包含其坐标)。

actionPerformed,当您收到点击时,请查看currentlySelected

  • 如果为null,则表示您应该选择点击的方格并将其放入currentlySelected
  • 如果它不为null,并且当前单击位于同一方格中,则用户可能希望取消选择它。在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;
                }
            }
        }
    }  
}