2011-12-09 30 views
1
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class CSE141HW5 implements ActionListener 
{ 

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

    } 


    /* Instance Variables */ 

    private JFrame gameWindow = new JFrame ("Tic-Tac-Toe"); 
    private int [][] winningCombinations = new int[][] {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}}; 
    private JButton buttons[] = new JButton [9]; 
    private int count = 0; 
    private String mark = ""; 
    private boolean win = false; 

    public CSE141HW5() 
    { 

     /* Creating gameWindow */ 

     Container con = gameWindow.getContentPane(); 
     con.setBackground(Color.WHITE); 

     gameWindow.setVisible (true); 
     gameWindow.setSize (220,220); 
     gameWindow.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     gameWindow.setLayout (new GridLayout (3, 3)); 
     gameWindow.setLocation (830, 400); 
     gameWindow.setBackground(Color.WHITE); 



     /* Adding Buttons */ 

     for (int i = 0; i <= 8; i++) 
     { 
      buttons[i] = new JButton(); 
      gameWindow.add (buttons [i]); 
      buttons[i].addActionListener (this); 
      buttons[i].setBackground(Color.WHITE); 

     }  


    } 


    /* When an object clicked... */ 

    public void actionPerformed (ActionEvent click) 
    { 
     JButton pressedButton = (JButton)click.getSource(); 
     /* Whose turn? */ 

     if ((count % 2) == 0) 
     { 
      mark = "O"; 
      pressedButton.setBackground(Color.CYAN); 
     } 
     else 
     { 
      mark = "X"; 
      pressedButton.setBackground(Color.yellow); 
     } 


     /* Write the letter to the button and deactivate it */ 


     pressedButton.setText (mark); 
     pressedButton.setEnabled (false); 


     /* Determining that who won */ 

     for (int i = 0; i <= 7; i++) 
     { 
      if (buttons[winningCombinations[i][0]].getText().equals(buttons[winningCombinations[i][1]].getText()) 
       && buttons[winningCombinations[i][1]].getText().equals(buttons[winningCombinations[i][2]].getText()) 
        && buttons[winningCombinations[i][0]].getText() != "") win = true; 
     } 


     /* Ending Dialog */ 

     if (win == true) 
     { 
      byte response = (byte) (JOptionPane.showConfirmDialog(null, mark + " won!\nPlay again?", "Homework 5", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)); 
      if (response == 0) new CSE141HW5(); 
      else System.exit(0); 
     } 

     else if (count == 8 && win == false) 
     { 
      byte response = (byte) (JOptionPane.showConfirmDialog(null, "Draw!\nPlay again?", "Homework 5", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)); 
      if (response == 0) new CSE141HW5(); 
      else System.exit(0); 
     } 

     count++;    
    } 

} 

我是一名編程新手,並且在java上編寫了一個tic-tac-toe遊戲。我想改善這個計劃,但有些事我無法處理。來自新手的幾個問題

  1. 我改變了默認顏色的按鈕顏色,如Color.ellow等。我如何使用更詳細的顏色?

  2. 當遊戲結束時,程序要求重新玩。如果用戶選擇是,那麼會出現新的遊戲窗口,但舊窗口仍然存在,我不喜歡。我想要關閉舊窗口,但無法找到如何實現它。

  3. 如果您發現我的程序中有任何代碼,您認爲這些代碼不必要,或者您認爲有比我更好的方法,請告訴我。所以我可以學習。

回答

1

我改變了默認顏色的按鈕顏色,如Color.ellow等。我如何使用更詳細的顏色?

您可以使用您自己的按鈕,比如說public class XButton extends JButton。要更好地定製您的按鈕,請覆蓋方法public void paintComponent(Graphics g)。然後,您可以使用fillRect填充按鈕的矩形,使用標準顏色將對象Graphics g設置爲Graphics2D,然後設置填充具有線性顏色漸變形狀的對象GradientPaint()

public class XButton extends JButton { 

    public XButton() { 
     super(); 
    } 

    public void paintComponent(Graphics g){ 
     Graphics2D g2d = (Graphics2D)g;   
     GradientPaint gp = new GradientPaint(0, 0, Color.RED, 30, 30, Color.cyan, true);     
     g2d.setPaint(gp); 
     g2d.fillRect(0, 0, this.getWidth(), this.getHeight()); 
    } 
} 

結果如下圖:

enter image description here

PS:在添加按鈕,通過Xbutton代替JButton,並僅此而已。


當遊戲配音,程序要求重新上場。如果用戶選擇是,那麼會出現新的遊戲窗口,但舊窗口仍然存在,我不喜歡。我想要關閉舊窗口,但無法找到如何實現它。

您只需使用的JFrame對象gameWindow的方法dispose(),所以地在你的代碼,你應該把:

  if (response == 0){ 
       gameWindow.dispose(); 
       new CSE141HW5(); 
      } 

爲更多細節How to programmatically close a JFrame


如果你發現我的節目,你覺得不必要,或者如果你認爲有更好的方式比我做什麼,請告訴我任何代碼。所以我可以學習。

那麼,你的代碼是好的。如果你想改善它。 StackOverflow不是正確的地方。你最好檢查:codereview.stackexchange.com

我希望我回答了你的問題。

1
  1. 使用RGB顏色進行着色。它是紅色,綠色和藍色的組合。紅色,綠色和藍色的值範圍爲0到255.例如:對於紅色,組合爲(255,0,0)
  2. 您可以使用gameWindow.setVisible (false);
1

如果你想徹底刪除窗口中使用的Dispose()函數。