java—有没有一种方法可以跳过actionlistener的鼠标点击?

yptwkmov  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(412)

我有一个tic-tac-toe图形用户界面,可以让用户玩电脑游戏。我使用一个actionlistener来接收用户鼠标点击他们想把“x”放在板上的位置。我的问题是,我的代码的设置方式,我的gui等待鼠标点击每当它的计算机在放置他们的作品。换言之,用户先把他们的“x”放在任何他们想要的地方。在用户离开后,用户必须点击电路板上的一个空块来模拟计算机转动,即模拟计算机放下一个“o”形块。我的目标是尝试让电脑的部件自动出现在电路板上,而不需要用户点击一个空部件来模拟电脑的运动。下面是我初始化使用actionlistener的板的代码:

private void initializeBoard() {
    Font f1 = new Font(Font.DIALOG, Font.BOLD, 100);

    for(int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            JButton button = new JButton();
            gameBoard[i][j] = button;
            button.setFont(f1);
            button.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    if(((JButton)e.getSource()).getText().equals("") && isWinner == false) {
                        if(isPlayersMove) //players turn to make a move
                        {
                            button.setText(currentPlayer);
                            isPlayersMove = false;
                            crossesCount += 1;
                        }
                        else //computers turn to make a move
                        {
                            computersMove();
                            circlesCount += 1;
                            isPlayersMove = true;
                        }
                        hasWinner();
                    }
                }
            });
            pane.add(button);
        }
    }       
}

下面是计算机如何确定放置工件的位置的代码(目前是随机的):

// Choose a random number between 0-2
private int getMove() {
    Random rand = new Random(); 
    int x = rand.nextInt(3);
    return x;
} 

/*
 * Decision making for the computer. Currently, the computer
 * chooses a piece on the board that is empty based on a random
 * value (0-2) for the row and column

* /

public void computersMove() {
    int row = getMove(), col = getMove();
    while(gameBoard[row][col].getText().equals("x") || //if space is occupied, choose new spot 
            gameBoard[row][col].getText().equals("o"))
    {
        row = getMove(); 
        col = getMove();
    }
    gameBoard[row][col].setText(computerPlayer);
}
aor9mmx1

aor9mmx11#

因为计算机应该在用户完成操作后立即移动,所以我相信您可以将它绑定到同一事件。这样,每当用户选择他的位置,他就会触发计算机的移动。
您可以选择在这两个操作之间添加一个短暂的延迟。

public void actionPerformed(ActionEvent e) {
    if(((JButton)e.getSource()).getText().equals("") && isWinner == false) {

        button.setText(currentPlayer);
        crossesCount += 1;
        hasWinner();

        // optional short delay

        computersMove();
        circlesCount += 1;
        hasWinner();
    }
}

相关问题