尝试使用“再次播放”JButton重置按钮。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Toolkit;
import java.awt.Image;
public class HW4_TicTacToePanel extends JFrame implements ActionListener {
// declare variables and arrays
private int counter = 0;
private String letter;
private boolean win = false;
private int[][] winConditions = new int[][]{
{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, //Horizontal wins
{0, 3, 6}, {1, 4, 7}, {2, 5, 8}, //Vertical wins
{0, 4, 8}, {2, 4, 6} //Diagonal wins
};
// JFrame Instructions
// private JButton buttons[] = new JButton[12];
// private JFrame gamewindow = new JFrame("Tic Tac Toe");
// End JFrame
// Panel demo
private JPanel southPanel; //panel for replay and exit button
private JButton[] optButtons;//Exit and replay buttons
private JPanel centerPanel;
private JButton[] gameButtons;//Tic tac toe squares
private GridLayout myGridLayout;
// End panel demo
public HW4_TicTacToePanel() //Constructor
{
super("Tic Tac Toe"); //super calls the JFrame controller
southPanel = new JPanel();// instantiate panel
optButtons = new JButton[2];//create an array of 2 buttons
String[] buttonNames = {"Play Again", "Exit"};
centerPanel = new JPanel(); //instantiate panel
gameButtons = new JButton[9];//creates an array of 9 buttons
myGridLayout = new GridLayout(3, 3, 2, 2);
setLayout(new BorderLayout());//set layout for JPanel
centerPanel.setLayout(myGridLayout);//set Layout for center panel
// add buttons to the centerPanel and add the ActionListener
for (int i = 0; i < gameButtons.length; i++) {
gameButtons[i] = new JButton();
centerPanel.add(gameButtons[i]);
gameButtons[i].addActionListener(this);
}
add(centerPanel, BorderLayout.CENTER); //add panel to JFrame
// add buttons to the southPanel and add the ActionListener
for (int i = 0; i < optButtons.length; i++) {
optButtons[i] = new JButton(buttonNames[i]);
southPanel.add(optButtons[i]);
}
//add functionality to replay and exit buttons
optButtons[0].addActionListener(this);
optButtons[1].addActionListener(this);
add(southPanel, BorderLayout.SOUTH); //adds panel to JFrame
}
public void actionPerformed(ActionEvent a) {
// Add Image icons
counter++;
//Calculate whose turn it is by using modulus to determine even or odd
if (counter % 2 == 0) {
letter = "O";
Icon o = new ImageIcon(getClass().getResource("O.gif"));
//Capture and show player input then disable button so it may not be reselected
JButton pressedButton = (JButton) a.getSource();
pressedButton.setIcon(o);
pressedButton.setText(letter);
pressedButton.setEnabled(false);
} else if (a.getSource() == optButtons[0])
{
//
//play again Instructions
//
System.exit(0);
} else if (a.getSource() == optButtons[1])
{
System.exit(0);
} else {
letter = "X";
Icon x = new ImageIcon(getClass().getResource("X.gif"));
//Capture and show player input then disable button so it may not be reselected
JButton pressedButton = (JButton) a.getSource();
pressedButton.setIcon(x);
pressedButton.setText(letter);
pressedButton.setEnabled(false);
}
//determine who won
for (int i = 0; i <= 7; i++) {
if (gameButtons[winConditions[i][0]].getText().equals(gameButtons[winConditions[i][1]].getText())
& gameButtons[winConditions[i][1]].getText().equals(gameButtons[winConditions[i][2]].getText())
& gameButtons[winConditions[i][0]].getText() != "") {
win = true;
}
}
//Show victor dialog
if (win == true) {
JOptionPane.showMessageDialog(null, letter + " wins the game!");
//Remove once optButtons are operational...
System.exit(0);
} else if (counter == 9 && win == false) {
JOptionPane.showMessageDialog(null, "The game was a tie!");
//Remove once optButtons are operational...
System.exit(0);
}
}
public static void main(String[] args) {
HW4_TicTacToePanel starter = new HW4_TicTacToePanel();
}
}
对于Play Again按钮,我正在考虑重置计数器并取消存储在游戏按钮中的任何值。我会在播放器作为else if语句移动的同一循环中实现它。
我一直在研究这个问题一段时间无济于事,有什么建议吗? 感谢
答案 0 :(得分:1)
使用那么多退出按钮,您只能退出。以下是一些代码改进:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Toolkit;
import java.awt.Image;
public class HW4_TicTacToePanel extends JFrame implements ActionListener {
private int counter = 0;
private int [] [] winConditions = new int [] [] {
{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, // Horizontal wins
{0, 3, 6}, {1, 4, 7}, {2, 5, 8}, // Vertical wins
{0, 4, 8}, {2, 4, 6} // Diagonal wins
};
private JButton [] gameButtons;
public HW4_TicTacToePanel ()
{
super ("Tic Tac Toe");
JPanel southPanel = new JPanel ();
JButton [] optButtons = new JButton [2];
String [] buttonNames = {"Play Again", "Exit"};
JPanel centerPanel = new JPanel ();
gameButtons = new JButton [9];
GridLayout myGridLayout = new GridLayout (3, 3, 2, 2);
setLayout (new BorderLayout ());
centerPanel.setLayout (myGridLayout);
for (int i = 0; i < gameButtons.length; i++) {
gameButtons [i] = new JButton ();
centerPanel.add (gameButtons [i]);
gameButtons [i].addActionListener (this);
}
add (centerPanel, BorderLayout.CENTER);
for (int i = 0; i < optButtons.length; i++) {
optButtons [i] = new JButton (buttonNames [i]);
southPanel.add (optButtons [i]);
optButtons [i].addActionListener (this);
}
add (southPanel, BorderLayout.SOUTH);
setSize (300, 300);
setLocation (200, 200);
setVisible (true);
}
private static Icon [] icon = new ImageIcon [] {
new ImageIcon ("/home/stefan/some/images/mini.null.jpg"),
new ImageIcon ("/home/stefan/daten/some/images/x.gif")};
private static String [] letter = new String [] {"x", "o"};
public void actionPerformed (ActionEvent a) {
// Add Image icons
counter++;
boolean win = false;
String cmd = a.getActionCommand ();
if (cmd.equals ("Play Again"))
{
dispose ();
HW4_TicTacToePanel.main (null);
}
else if (cmd.equals ("Exit"))
{
dispose ();
} else {
// Calculate whose turn it is by using modulus to determine even or odd
JButton pressedButton = (JButton) a.getSource ();
pressedButton.setIcon (icon [counter%2]);
pressedButton.setText (letter[counter%2]);
pressedButton.setEnabled (false);
}
//determine who won
for (int i = 0; i <= 7; i++) {
if (gameButtons [winConditions [i] [0]].getText ().equals (gameButtons [winConditions [i] [1]].getText ())
& gameButtons [winConditions [i] [1]].getText ().equals (gameButtons [winConditions [i] [2]].getText ())
& gameButtons [winConditions [i] [0]].getText () != "") {
win = true;
}
}
//Show victor dialog
if (win == true) {
JOptionPane.showMessageDialog (null, letter[counter%2] + " wins the game!");
} else if (counter == 9 && win == false) {
JOptionPane.showMessageDialog (null, "The game was a tie!");
}
}
public static void main (String [] args) {
new HW4_TicTacToePanel ();
}
}
一些提示:
(a.getSource() == optButtons[0])
什么是optButtons [0]?如果您使用a.getActionCommand ().equals ("Play Again")
代替,代码会记录自己。