2

尝试使用“再次播放”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();
    }
}

对于再次播放按钮,我正在考虑重置计数器并取消存储在游戏按钮中的任何值。我会在玩家作为 else if 语句移动时在同一个循环中实现这一点。

我一直在研究这个问题,但无济于事,有什么建议吗?谢谢

4

1 回答 1

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 ();
    }
}

一些提示:

  • 不要在注释中重复您在代码中编写的内容。
  • 不要评论,每个Java程序员都应该知道(构造函数长什么样,属性实例化是什么。
  • 仅在必须使用的地方使用属性。JPanel 通常只在 ctor 中使用——它们不需要在其他地方可以访问。
  • 如果您不引用变量(main 中的启动器) - 不要使用引用。
  • 为什么不将 addActionListener 放入循环中?
  • (a.getSource() == optButtons[0])什么是 optButtons[0]?如果您a.getActionCommand ().equals ("Play Again")改为使用,则代码会自行记录。
  • 使用数组是个好主意。更进一步!
  • setSize/...location/...visible - 没有它你怎么工作?
  • 请享用。:)
于 2012-05-11T02:24:42.717 回答