【问题标题】:How to take a second actionPerformed for moving a chess piece?如何采取第二次行动来移动棋子?
【发布时间】:2015-02-27 12:40:09
【问题描述】:

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

【问题讨论】:

    标签: java swing chess


    【解决方案1】:

    你不会做“第二个actionPerformed”。你要做的就是保持状态,当点击发生时,查看状态,然后决定应该采取什么行动。

    例如,围绕一个名为 currentlySelected 的字段,指向当前选定的正方形(例如包含其坐标)。

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

    • 如果为null,则表示你应该选择点击的方块并放入currentlySelected
    • 如果不为空,并且当前点击在同一个方格,用户可能想取消选择它。在currentlySelected 中取消选择并清除(置空)。
    • 如果不为null且不是同一个格子,则表示要检查该走法是否合法。如果它是合法的,你可以采取行动,并清除currentlySelected。如果它不合法,你就做你认为正确的事情:也许取消选择原来的地方并选择新的地方。或者只是取消选择并告诉用户移动是不合法的。或者保持选中状态。

    请记住在适当的情况下始终清除您的currentlySelected

    【讨论】:

    • 这是一个很好的答案,为清晰简洁的信息投了赞成票。
    • @MSB:我同意这一点。它的配方很好。 +1
    【解决方案2】:

    您不需要第二个 ActionListener 或 actionPerformed 方法,而是需要一个 state-ful ActionListener,它知道按钮按下是代表第一次按下还是第二次按下。一个布尔变量可能就是这一切所需要的。另一种选择是使用变量来表示第一次推送的位置,最初将其设置为 null,然后将其设置为等于第一次推送的位置。在第二次按下时检查它是否为空或非空,如果非空,则按钮按下表示第二次按下。然后将其设置回 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;
                    }
                }
            }
        }  
    }
    

    【讨论】:

    • 另见另一个chess GUI,它存储了blinkingState,它决定了在计时器的动作中应该显示动画的哪个部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多