我正在為 GUI 使用 Swing 制作井字游戲 Java 應用程式。當我以 O 身份玩游戲時,我的游戲運行正常,但如果我選擇 X 并且游戲板填滿程式,則程式會凍結,而不會填寫最后一個框并顯示獲勝或平局訊息。當程式凍結時,我必須從 IDE 關閉程式。下面的游戲邏輯將不勝感激任何反饋。
public void actionPerformed(ActionEvent e) {
//Checking which button is pressed to assign player to X or O.
if(e.getSource() == X){
player1 = "X";
computer = "O";
playerTurn = true;
board.setVisible(true);
} else if(e.getSource() == O){
player1 = "O";
computer = "X";
playerTurn = false;
board.setVisible(true);
}
//After player chooses which to play as, this will check to see which value should go in the button based on whose turn it is.
else{
JButton src = (JButton) e.getSource();
if(playerTurn) {
src.setText(player1);
winCheck(player1);
tieCheck();
}
else{
src.setText(computer);
}
//Changing player turn from false to true or vice versa at the end of each turn
playerTurn = !playerTurn;
}
//Gets rid of the input panel once the player chooses X or O.
if(!player1.equals("")){
inputPanel.setVisible(false);
}
//Computer turn logic
if(!playerTurn){
int choice = rand.nextInt(9);
JButton src = buttons[choice];
while(!src.getText().equals("")){
choice = rand.nextInt(9);
src = buttons[choice];
}
src.setText(computer);
winCheck(computer);
tieCheck();
playerTurn = !playerTurn;
}
//After there is a winner, either create a new game window or close the window and end the program
if(hasWinner){
if(e.getSource() == X){
new Moser_Problem1();
frame.dispose();
} else if(e.getSource() == O){
frame.dispose();
}
}
}
public void winCheck(String player) {
//All possible winning combos for tic-tac-toe board.
if(buttons[0].getText().equals(player) && buttons[1].getText().equals(player) && buttons[2].getText().equals(player)){
xOro.setText(player " wins!\n Do you want to play again?");
player1 = "";
inputPanel.setVisible(true);
X.setText("Yes");
O.setText("No");
hasWinner = true;
} else if(buttons[3].getText().equals(player) && buttons[4].getText().equals(player) && buttons[5].getText().equals(player)){
xOro.setText(player " wins!\n Do you want to play again?");
player1 = "";
inputPanel.setVisible(true);
X.setText("Yes");
O.setText("No");
hasWinner = true;
} else if(buttons[6].getText().equals(player) && buttons[7].getText().equals(player) && buttons[8].getText().equals(player)){
xOro.setText(player " wins!\n Do you want to play again?");
player1 = "";
inputPanel.setVisible(true);
X.setText("Yes");
O.setText("No");
hasWinner = true;
} else if(buttons[0].getText().equals(player) && buttons[3].getText().equals(player) && buttons[6].getText().equals(player)){
xOro.setText(player " wins!\n Do you want to play again?");
player1 = "";
inputPanel.setVisible(true);
X.setText("Yes");
O.setText("No");
hasWinner = true;
} else if(buttons[1].getText().equals(player) && buttons[4].getText().equals(player) && buttons[7].getText().equals(player)){
xOro.setText(player " wins!\n Do you want to play again?");
player1 = "";
inputPanel.setVisible(true);
X.setText("Yes");
O.setText("No");
hasWinner = true;
} else if(buttons[2].getText().equals(player) && buttons[5].getText().equals(player) && buttons[8].getText().equals(player)){
xOro.setText(player " wins!\n Do you want to play again?");
player1 = "";
inputPanel.setVisible(true);
X.setText("Yes");
O.setText("No");
hasWinner = true;
} else if(buttons[0].getText().equals(player) && buttons[4].getText().equals(player) && buttons[8].getText().equals(player)){
xOro.setText(player " wins!\n Do you want to play again?");
player1 = "";
inputPanel.setVisible(true);
X.setText("Yes");
O.setText("No");
hasWinner = true;
} else if(buttons[6].getText().equals(player) && buttons[4].getText().equals(player) && buttons[2].getText().equals(player)){
xOro.setText(player " wins!\n Do you want to play again?");
player1 = "";
inputPanel.setVisible(true);
X.setText("Yes");
O.setText("No");
hasWinner = true;
} else{
hasWinner = false;
}
}
public void tieCheck(){
//Checks for a tie by adding getting the text from each box and making sure none are empty.
//If one is empty, nothing will happen, but if there are no empty spaces will print out a tie message.
boolean hasEmptySpot = false;
for (JButton button : buttons) {
String check = button.getText();
if (check.equals("")) {
hasEmptySpot = true;
}
}
if(!hasEmptySpot){
xOro.setText("It's a tie!\n Would you like to play again?");
X.setText("Yes");
O.setText("No");
player1 = "";
inputPanel.setVisible(true);
hasWinner = true;
}
}
}
程式運行時沒有例外或錯誤,但由于某種原因,在播放 x 時填滿了棋盤會凍結整個程式。
uj5u.com熱心網友回復:
[...] 但由于某種原因,當 x 播放時填滿棋盤會凍結整個程式。
問題是while您擁有的回圈:
int choice = rand.nextInt(9);
JButton src = buttons[choice];
while(!src.getText().equals("")){
choice = rand.nextInt(9);
src = buttons[choice];
}
這將選擇一個隨機的免費按鈕。但是當游戲完成時,您將進入這個while回圈,特別是在沒有贏家(平局)時。這意味著您正試圖找到一個空閑按鈕,但沒有。因此,您的事件處理程式JButton陷入while()回圈,阻塞了整個 GUI 執行緒。
當棋盤完全填滿時,您不能為電腦玩家找到下一步行動。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/516700.html
標籤:爪哇摇摆
