有没有办法跳过 ActionListener 的鼠标点击?
Is there a way to skip a mouse click for ActionListener?
我有一个井字游戏 GUI,可以让用户与计算机对战。我使用 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);
}
因为计算机应该在用户移动后立即移动,我相信您可以将它绑定到同一事件。这样,每当用户选择他的位置时,他就会触发计算机移动。
您可以选择在这两个操作之间添加一个短暂的延迟。
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();
}
}
我有一个井字游戏 GUI,可以让用户与计算机对战。我使用 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);
}
因为计算机应该在用户移动后立即移动,我相信您可以将它绑定到同一事件。这样,每当用户选择他的位置时,他就会触发计算机移动。
您可以选择在这两个操作之间添加一个短暂的延迟。
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();
}
}