2012-06-09 218 views
1

我是學習Java編程的初學者,我正在做井字遊戲。井字遊戲java

當我完成我的遊戲後,我無法繼續玩遊戲,因爲程序將退出。我應該添加到這個代碼。由於我不使用繪畫方法,因此不能使用repaint()。

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

public class TicTacToeV1 implements ActionListener { 
    /*Instance Variables*/ 
    private JFrame window = new JFrame("Tic-Tac-Toe"); 
    private JButton button1 = new JButton(""); 
    private JButton button2 = new JButton(""); 
    private JButton button3 = new JButton(""); 
    private JButton button4 = new JButton(""); 
    private JButton button5 = new JButton(""); 
    private JButton button6 = new JButton(""); 
    private JButton button7 = new JButton(""); 
    private JButton button8 = new JButton(""); 
    private JButton button9 = new JButton(""); 

    private String letter = ""; 
    public static int count = 0; 
    public TicTacToeV1(){   
     /*Create Window*/ 
     window.setSize(300,300); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setLayout(new GridLayout(3,3)); 

     /*Add Buttons To The Window*/ 
     window.add(button1); 
     window.add(button2); 
     window.add(button3); 
     window.add(button4); 
     window.add(button5); 
     window.add(button6); 
     window.add(button7); 
     window.add(button8); 
     window.add(button9); 

     /*Add The Action Listener To The Buttons*/ 
     button1.addActionListener(this); 
     button2.addActionListener(this); 
     button3.addActionListener(this); 
     button4.addActionListener(this); 
     button5.addActionListener(this); 
     button6.addActionListener(this); 
     button7.addActionListener(this); 
     button8.addActionListener(this); 
     button9.addActionListener(this); 

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

     String input = JOptionPane.showInputDialog("Please select ur pawn: \n1) X\n2) O"); 
     int pawn = Integer.parseInt(input); 
     if (input.equals("2")){ 
       setCount(1); 
     } 
    } 

    public static void setCount (int co){ 
     count = co;    
    } 

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

     /*Calculate Who's Turn It Is*/ 
     if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9|| count == 11){ 
      letter = "X"; 

     } else if(count == 2 || count == 4 || count == 6 || count == 8 || count == 10){ 
      letter = "O"; 
     } 

     /*Display X's or O's on the buttons*/ 
     if(a.getSource() == button1){ 
      button1.setText(letter); 
      button1.setEnabled(false); 
     } else if(a.getSource() == button2){ 
      button2.setText(letter); 
      button2.setEnabled(false); 
     } else if(a.getSource() == button3){ 
      button3.setText(letter); 
      button3.setEnabled(false); 
     } else if(a.getSource() == button4){ 
      button4.setText(letter); 
      button4.setEnabled(false); 
     } else if(a.getSource() == button5){ 
      button5.setText(letter); 
      button5.setEnabled(false); 
     } else if(a.getSource() == button6){ 
      button6.setText(letter); 
      button6.setEnabled(false); 
     } else if(a.getSource() == button7){ 
      button7.setText(letter); 
      button7.setEnabled(false); 
     } else if(a.getSource() == button8){ 
      button8.setText(letter); 
      button8.setEnabled(false); 
     } else if(a.getSource() == button9){ 
      button9.setText(letter); 
      button9.setEnabled(false); 
     }  
    } 

    public static void main(String[] args){   
      new TicTacToeV1(); 
    } 
} 
+2

給它一個'reset()'方法,你重置你的程序的狀態,並從resetButton的ActionListener調用它。 –

+2

你真的應該看看這裏的二維數組 - 這將簡化代碼,並使'復位'方法Hovercraft建議更簡單。另外,雖然一些空間通常被認爲是一個好主意,但人們可以做得更好。 – Voo

+2

我的瀏覽器她滾動... –

回答

1

創建一個稱爲復位(或類似的東西)方法,使之做到以下幾點:

  1. 重置每個文本值。
  2. 重置計數爲0

你可能想使[]數組(或二維數組,如果你知道如何>> [] [])的按鈕,以及其更易於管理。這可以更好地管理許多按鈕,並刪除當前代碼中無用的重複。

示例代碼:

public static void reset() { 
    button1.setText(""); 
    button1.setEnabled(true); 
    //etc... 
    count = 0; 
} 

然後只需調用reset()方法時,遊戲結束(你可能想也讓它檢查誰贏得了)。

希望這有助於和DFTBA。 :)

1

a)您的整個代碼適合50行。 b)你不必檢測贏家還是完成遊戲的方法,所以我剛纔添加的代碼計數==後9

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

public class TicTacToeV1 extends JFrame implements ActionListener { 
    private JButton [] button = new JButton [9]; 
    private int count = 0; 

    public TicTacToeV1() {   
     super ("Tic-Tac-Toe"); 
     setSize (300, 300); 
     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     setLayout (new GridLayout (3, 3)); 
     init(); 
    } 

    private void init() {   
     count = 0; 
     for (int i = 0; i < 9; ++i) { 
      button [i] = new JButton (""); 
      button [i].addActionListener (this); 
      add (button [i]); 
     } 
     setVisible (true); 
    } 

    public void actionPerformed (ActionEvent a) {  
     String letter = (++count % 2 == 1) ? "X" : "O"; 
     /*Display X's or O's on the buttons*/ 
     for (JButton jb : button) 
     if (a.getSource() == jb) { 
      jb.setText (letter); 
      jb.setEnabled (false); 
     } 
     if (count == 9) { 
      for (JButton jb : button) 
       remove (jb) ; 
      init(); 
     } 
    } 

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

我把可變部分到它自己的方法(INIT) ,並從Ctor或從遊戲結束的方法中調用它。

當然你也可以從那裏調用一個新的Ctor。或者只需重置按鈕狀態和計數器。羅馬有很多方法。雖然它不應該扮演一個角色,但是通過他們的所有按鈕避免100個結局遊戲在內存中可能會節省10kb的內存。

+0

這是一個非常常見的CS課程問題(其概率作業)。修復他的整個方法,以便他可以複製和粘貼,不會讓他成爲更好的程序員。 – mawburn

+1

@MadBurn:是的,但是新手通常在初始化非初始化數組時遇到問題,將9個按鈕的數組與9個按鈕自己混淆,因此得到NPE,所以我做出了一個沒有有意義的新遊戲檢測的工作解決方案。 user1403675可能會查看它,並嘗試寫入相同的內容而不再查看或剪切粘貼;那是他的選擇。他有一些未使用的代碼來選擇第一位玩家使用哪個符號,並且需要做一些事情才能使其工作。 –