2016-04-03 13 views
-4

Ich mache im Grunde ein Tic Tac Toe-Spiel, mit AI und alle, und mein System ist, die Tasten zu zeichnen, und eine Boolean für jede Taste zugewiesen, wo es zu wahr zugewiesen wird, wenn es genommen wird durch ein X oder falsch, wenn es leer ist. Es stützt sich auf die richtige Größe und das Layout und alle, aber in meiner Aktion Hörer es gibt mir den Fehler:Letzte lokale Variable Fehler

Edit: entfernt, um das Finale, so dass die Fehler

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

, wenn ich die boolean true ändern nach dem Zuweisen des Schaltflächentextes zu '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

Ja, die letzte Variable (z. B. "final boolean tleft") ist _final_ und darf nach der Initialisierung nicht geändert werden. – KevinO

+5

Was bedeutet "final"? –

Antwort

0

Es gibt zwei Probleme. Erstens können Sie die endgültigen Variablen nicht ändern. Zweitens müssen Sie letzte Variablen verwenden, um einen Bereich innerhalb der Listener zu haben. Dieser Code benötigt ein ernsthaftes Refactoring. Hier ist jedoch eine schnelle Lösung, die nur minimale Eingriffe erfordert.

  1. entfernen alle der boolean tleft; boolean tmid; ... Variablen

  2. Dieses Enum außerhalb der main() Methode Definition

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

    };

  3. diese Definition an der entsprechenden Stelle hinzufügen

    // 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. Ersetzen Sie die Zuhörer mit den folgenden, die Tleft entsprechend anpassen. Ziehen Sie jedoch ernsthaft in Betracht, eine Methode zu erstellen, die den Mausadapter zurückgibt.

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

Der Fehler Sie erhalten beseitigt werden.

+0

Ich bin sehr vertraut mit Java, also alles was ich nicht wusste (was viel ist und ich musste viel lernen, wie JFrame hier arbeitete) musste ich googeln. Ich erhalte eine Fehlermeldung „Mehrere Marker an dieser Linie \t - Syntaxfehler auf Token‚(‘; erwartet \t - Syntaxfehler auf Token‚)‘; erwartet \t - Leere ist ein ungültiger Typ für die Variable mouseClicked "Hier ist mein Code. Der Fehler ist in Zeile 58 http://pastebin.com/ZmrL33aN –

+0

@JakeHenderson, möglicherweise haben Sie den Fehler überstanden, aber im ursprünglichen Code, den Sie hatten, z. B. 'topLeft.addMouseListener (new java.awt.event.MouseAdapter() {...} '. In jedem' addMouseListener'-Eintrag müssen Sie die 'public void mouseClicked' hinzufügen, wie ich es vorgeschlagen habe. Allerdings müssen Sie für jeden einzelnen die' ESide.left' ändern, damit sie mit dem jeweiligen übereinstimmt Wenn Sie weitere Probleme haben, starten Sie bitte eine neue Frage. – KevinO