将写入的代码拆分为两个类(JAVA)

时间:2011-05-02 05:42:21

标签: java

我正在为我的Java写一个tic-tac-toe游戏,到目前为止我对此非常感兴趣,但让它与他在课堂上给我们的例子一起工作。我现在遇到的问题是我意识到希望我们为这个程序至少拥有两个类。我不知道他的意思是什么,或者我如何将我已经放在一起的代码转换为“两个类”。根据说明,他看起来他希望一个班级的董事会和另一个班级的游戏。

有没有办法将它分成两个类而不完全重写整个事情?

/* Standard applet template
*/

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import javax.swing.*;


public class TicTacToeGame implements ActionListener {
    /*Instance Variables*/
    private JFrame window = new JFrame("Tic-Tac-Toe Game");
    private JButton btn1 = new JButton("");
    private JButton btn2 = new JButton("");
    private JButton btn3 = new JButton("");
    private JButton btn4 = new JButton("");
    private JButton btn5 = new JButton("");
    private JButton btn6 = new JButton("");
    private JButton btn7 = new JButton("");
    private JButton btn8 = new JButton("");
    private JButton btn9 = new JButton("");
    private JLabel lblTitle = new JLabel("Tic Tac Toe Game");
    private JLabel lblBlank = new JLabel(" ");
    private String letter = "";
    private int count = 0;
    private boolean win = false;

    public TicTacToeGame(){
    /*Create Window*/
    window.setSize(400,300);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setLayout(new GridLayout(3,3));

    /*Add Buttons To The Window*/
    window.add(btn1);
    window.add(btn2);
    window.add(btn3);
    window.add(btn4);
    window.add(btn5);
    window.add(btn6);
    window.add(btn7);
    window.add(btn8);
    window.add(btn9);

    /*Add The Action Listener To The Buttons*/
    btn1.addActionListener(this);
    btn2.addActionListener(this);
    btn3.addActionListener(this);
    btn4.addActionListener(this);
    btn5.addActionListener(this);
    btn6.addActionListener(this);
    btn7.addActionListener(this);
    btn8.addActionListener(this);
    btn9.addActionListener(this);

    /*Make The Window Visible*/
    window.setVisible(true);
    }

    public void actionPerformed(ActionEvent a) {
        count++;

        /*Calculate Who's Turn It Is*/
        if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9){
        letter = "<HTML><font color=blue>X</font></HTML>";
        } else if(count == 2 || count == 4 || count == 6 || count == 8 || count == 10){
        letter = "<HTML><font color=red>O</font></HTML>";
        }

        /*Display X's or O's on the buttons*/
        if(a.getSource() == btn1){
            btn1.setText(letter);
            btn1.setEnabled(false);
        } else if(a.getSource() == btn2){
            btn2.setText(letter);
            btn2.setEnabled(false);
        } else if(a.getSource() == btn3){
            btn3.setText(letter);
            btn3.setEnabled(false);
        } else if(a.getSource() == btn4){
            btn4.setText(letter);
            btn4.setEnabled(false);
        } else if(a.getSource() == btn5){
            btn5.setText(letter);
            btn5.setEnabled(false);
        } else if(a.getSource() == btn6){
            btn6.setText(letter);
            btn6.setEnabled(false);
        } else if(a.getSource() == btn7){
            btn7.setText(letter);
            btn7.setEnabled(false);
        } else if(a.getSource() == btn8){
            btn8.setText(letter);
            btn8.setEnabled(false);
        } else if(a.getSource() == btn9){
            btn9.setText(letter);
            btn9.setEnabled(false);
        }

        /*Checks to See Who Won*/
        //horizontal win
        if( btn1.getText() == btn2.getText() && btn2.getText() == btn3.getText() && btn1.getText() != ""){
            win = true;
        }
        else if(btn4.getText() == btn5.getText() && btn5.getText() == btn6.getText() && btn4.getText() != ""){
            win = true;
        }
        else if(btn7.getText() == btn8.getText() && btn8.getText() == btn9.getText() && btn7.getText() != ""){
            win = true;
        }

        //virticle win
        else if(btn1.getText() == btn4.getText() && btn4.getText() == btn7.getText() && btn1.getText() != ""){
            win = true;
        }
        else if(btn2.getText() == btn5.getText() && btn5.getText() == btn8.getText() && btn2.getText() != ""){
            win = true;
        }
        else if(btn3.getText() == btn6.getText() && btn6.getText() == btn9.getText() && btn3.getText() != ""){
            win = true;
        }

        //diagonal wins
        else if(btn1.getText() == btn5.getText() && btn5.getText() == btn9.getText() && btn1.getText() != ""){
            win = true;
        }
        else if(btn3.getText() == btn5.getText() && btn5.getText() == btn7.getText() && btn3.getText() != ""){
            win = true;
        }
        else {
            win = false;
        }

        /*Show a dialog if someone wins or the game is tie*/
        if(win == true){
            JOptionPane.showMessageDialog(null, letter + " WINS!");
        } else if(count == 9 && win == false){
            JOptionPane.showMessageDialog(null, "Tie Game!");
        }
    }

    public static void main(String[] args){
        new TicTacToeGame();
    }
}

4 个答案:

答案 0 :(得分:3)

有多种方法可以分割这个类,但由于它不是很大,所以大多数方法最终都会重写它。

最干净方式是将逻辑和UI分成(至少)两个单独的类:

  • TicTacToeGame将实现逻辑:它有一个查询轮到谁的方法,一些查询比赛场地状态的方法,一个进入下一步的方法,一个查询状态的方法游戏(播放,结束),一种查询谁赢了的方法,可能是一种注册听众的方法
  • TicTacToeUI只获取另一个类的实例的信息并显示它。单击一个按钮时,它还会调用适当的方法。

净效果可能是更多代码(因为两个类之间的交互需要一些代码),但代码会更清晰,游戏类可以独立于UI进行测试。

答案 1 :(得分:0)

你可以做的很简单的事情是创建实现ActionListener的第二个类,然后使用该类来监听程序中的所有动作事件。这不是你想要的方式,一个用于棋盘,一个用于游戏,但这可以是一个用于操作,一个用于演示。

答案 2 :(得分:0)

约阿希姆给出了一个很好的答案。我只是想补充一点,而不是这样做:

/*Display X's or O's on the buttons*/
if(a.getSource() == btn1){
  btn1.setText(letter);
  btn1.setEnabled(false);
...
} else if(a.getSource() == btn9){
  btn9.setText(letter);
  btn9.setEnabled(false);
}

你可以这样做:

JButton btn = (JButton) a.getSource();
btn.setText(letter);
btn.setEnabled(false);

答案 3 :(得分:0)

我认为你的意见是对逻辑分裂的一个很好的暗示。将每个部分放在一个单独的方法中,以便您的actionPerformed方法类似于以下内容。

public void actionPerformed(ActionEvent a) {
    count++;
    letter = calculateCurrentPlayer(count);
    displayLetterOnButton(a.getSource());
    win = checkForWin();
    displayGameOver(win, count);
}

actionPerformed调用的每个方法都会有一个小的严格定义的工作单元来执行。这些方法几乎可以从当前actionsPerformed方法的部分进行复制和粘贴。