2016-04-03 62 views
-4

我基本上是用AI和所有制作一個tic tac toe遊戲,而我的系統是繪製按鈕,並且爲每個按鈕分配一個布爾值,如果它被採用,它被分配爲true由X表示,如果爲空,則爲false。這引出正確的大小和佈局,但在我的動作偵聽它給我的錯誤:最終局部變量錯誤

編輯:刪除了總決賽,仍然給錯誤

"The final local variable cannot be assigned since it is defined in an enclosing type."

當我改變布爾爲真將按鈕文本分配給'x'後。

package myClass; 
import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class mainClass { 

    public static void main(String[] args) { 
     //create window 
     JFrame mainWindow = new JFrame("Tic Tac Toe"); 
     //properties of mainWindow 
     mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWindow.setSize(600, 600); // buttons will fill entirely, 200x200 buttons 
     mainWindow.setLayout(new GridLayout(3, 3)); 

     //create buttons 
     JButton topLeft = new JButton(""); 
     JButton topMid = new JButton(""); 
     JButton topRight = new JButton(""); 
     JButton midLeft = new JButton(""); 
     JButton midMid = new JButton(""); 
     JButton midRight = new JButton(""); 
     JButton botLeft = new JButton(""); 
     JButton botMid = new JButton(""); 
     JButton botRight = new JButton(""); 


     //checker for if the button already has a character 
boolean tmid = false; 
boolean tright = false; 
boolean mleft = false; 
boolean mmid = false; 
boolean mright = false; 
boolean bleft = false; 
boolean bmid = false; 
boolean bright = false; 

     //button properties 
     Dimension buttonSize = new Dimension(200,200); 
     topLeft.setSize(buttonSize); 
     topMid.setSize(buttonSize); 
     topRight.setSize(buttonSize); 
     midLeft.setSize(buttonSize); 
     midMid.setSize(buttonSize); 
     midRight.setSize(buttonSize); 
     botLeft.setSize(buttonSize); 
     botMid.setSize(buttonSize); 
     botRight.setSize(buttonSize); 

     //Action listener 
     topLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(tleft == false){ 
       topLeft.setText("X"); 
       tleft = true; 
      } 
      } 
     }); 
     topMid.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(tmid == false){ 
       topMid.setText("X"); 
       tmid = true; 
      } 
      } 
     }); 
     topRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(tright == false){ 
       topRight.setText("X"); 
       tright = true; 
      } 
      } 
     }); 
     midLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(mleft == false){ 
       midLeft.setText("X"); 
       mleft = true; 
      } 
      } 
     }); 
     midMid.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(mmid == false){ 
       midMid.setText("X"); 
       mmid = true; 
      } 
      } 
     }); 
     midRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(mright == false){ 
       midRight.setText("X"); 
       mright = true; 
      } 
      } 
     }); 
     botLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(bleft == false){ 
       botLeft.setText("X"); 
       bleft = true; 
      } 
      } 
     }); 
     botMid.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(bmid == false){ 
       botMid.setText("X"); 
       bmid = true; 
      } 
      } 
     }); 
     botRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(bright == false){ 
       botRight.setText("X"); 
       bright = true; 
      } 
      } 
     }); 




     //draw components 
     mainWindow.add(topLeft); 
     mainWindow.add(topMid); 
     mainWindow.add(topRight); 
     mainWindow.add(midLeft); 
     mainWindow.add(midMid); 
     mainWindow.add(midRight); 
     mainWindow.add(botLeft); 
     mainWindow.add(botMid); 
     mainWindow.add(botRight); 

     mainWindow.setVisible(true); // draw it 
    } 


} 
+5

是的,最終變量(例如'final boolean tleft')是_final_並且在它們被初始化後可能不會被修改。 – KevinO

+5

你認爲'最終'的含義是什麼? –

回答

0

有兩個問題。一,你不能修改最終變量。二,你必須使用最終變量來在偵聽器中有作用域。這段代碼需要嚴肅的重構。但是,這是一個需要最小干預的快速解決方案。

  1. 取下所有boolean tleft; boolean tmid; ...變量

  2. 添加該枚舉的main()方法定義

    enum ESide { 
        tleft, tmid, tright, 
        mleft, mmid, mright, 
        bleft, bmid, bright, 
    

    }的外部;

  3. 在適當的點

    // checker for if the button already has a character 
    final Map<ESide, Boolean> board = new HashMap<>(); 
    for (ESide side : ESide.values()) { 
        board.put(side, false); 
    } 
    
  4. 添加該定義替換聽衆以下,調整tleft適當。但是,認真考慮製作一個返回鼠標適配器的方法。

    public void mouseClicked(java.awt.event.MouseEvent evt) 
        { 
         if (board.get(ESide.tleft).booleanValue() == false) { 
          topLeft.setText("X"); 
          board.put(ESide.tleft, true); 
         } 
        } 
    

您收到的錯誤就會被淘汰。

+0

我對java非常瞭解,所以任何我不知道的東西(這很多,我必須學習JFrame如何在這裏工作)我不得不穀歌。我得到一個錯誤「多個標記在該行 \t - 令牌語法錯誤‘(’;預計 \t - 語法錯誤令牌‘)’;預計 \t - 虛空是一個無效的類型變量的mouseClicked 「這是我的代碼。這個錯誤在第58行http://pastebin.com/ZmrL33aN –

+0

@JakeHenderson,你可能已經超越了錯誤,但是在你原來的代碼中,例如'topLeft.addMouseListener(new java.awt.event.MouseAdapter (){...}'在每個'addMouseListener'條目中,您都需要按照我的建議添加'public void mouseClicked'。但是,對於每一個'''''''''如果您還有其他問題,請發起一個新問題。 – KevinO