2016-06-20 13 views
1

Ich habe mich hier um eine Lösung gekümmert, aber ich kann keine finden. Ich habe versucht these ones und viele andere, und ich laufe auf das gleiche Problem.Aufruf der nicht statischen Methode (in einer anderen Klasse) als statische

Ich versuche, ein einfaches Text-Spiel zu machen, und ich laufe in die Frage, wo ich eine Hauptklasse habe, und eine Klasse namens „Spielfeld“, die ich als ein Array habe wie folgt definiert:

static GameBoard[] gameboard = new GameBoard[9];

Jetzt funktioniert das gut, bis ich versuche, die Eigenschaften eines einzelnen dieser Array-Objekte zu ändern. Ich werde tun:

gameboard[input].setState(2); 

und die spezifische Instanz von Spielplatte, die sein wird, nicht die einzige verändern sollte: sie alle ändern, wenn ich dies tun. Es ist komisch. Nur gameboard[**input**] sollte sich ändern, nicht alle 9 der GameBoard-Instanzen. JEDE Variable und Methode, die ich habe, ist "statisch", aber wegen der Hauptmethode (public static void main ...) scheint alles statisch zu sein. Wie kann ich all diese statische Elektrizität loswerden?

Game Klasse

package com.name.tictactoe; 

public class GameBoard { 
char[] States = {'N','X','O'}; 
char state; 

public void setState(int s){ 
    state = States[s]; 
} 
public char getState(){ 
    return state; 
} 
} 

Hauptklasse (genannt Spiel)

package com.name.tictactoe; 

import java.util.Scanner; 

public class Game { 

static boolean turn, win; 
static GameBoard[] gameboard; 
static Scanner kb = new Scanner(System.in); 
static int input; 

public static void main(String[] args){ 
    gameboard = new GameBoard[9]; 
    reset(); 
    displayStates(); 
    askTurn(); 
    displayStates(); 
    askTurn(); 

} 

public static void askTurn() { 
    System.out.println(); 
    System.out.println(); 
    System.out.println("Where do you want to go? Use the numbers shown, where the first segment is the top and the last is the bottom - left to right."); 
    input = kb.nextInt(); 
    if(input > 8){ 
     System.out.println("Input out of bounds. Game over by default."); 
     try { 
      Thread.sleep(1000000000);} catch (InterruptedException e) {e.printStackTrace();} 
    } 
    gameboard[input].setState(2); 
} 

public static void reset(){ 
    for(int i = 0; i < 9; i++){ 
     gameboard[i].setState(0); 
    } 
} 

public static void displayStates(){ 
    for(int i = 0; i < 9; i++){ 
     System.out.print(gameboard[i].getState() + " "); 
     if(i ==2 || i ==5){ 
      System.out.print(" II "); 
     } 
    } 
    System.out.println(); 
    for(int i = 0; i < 9; i++){ 
     System.out.print(i + " "); 
     if(i ==2 || i ==5){ 
      System.out.print(" II "); 
     } 
    } 
    System.out.println(); 
} 

}

UPDATE: Die aktuellen Antworten nicht funktionieren. Obwohl Eclipse dies nicht erkennt, verursacht GameBoard nicht-statisch Nullzeiger-Ausnahmen, wenn auf eine Methode verwiesen wird.

+0

"Jede Variable und Methode, die ich habe, ist" statisch "" - das ist keine gute Idee, wenn Sie wollen, dass verschiedene Instanzen einen anderen Zustand haben. Verstehst du was "statisch" bedeutet? –

+0

Ihr Problem ist, Sie versuchen, "statische" Instanzen zu haben, was ein Widerspruch ist. 'setState' ändert nicht alle von ihnen, Sie haben nur einen Satz von statischen Variablen zu aktualisieren. – Grayson

+0

Nicht vollständig, obwohl ich Java vor über 2 Jahren gelernt habe. Ich habe in letzter Zeit nicht viel Java benutzt, aber ich erinnere mich nicht, jemals "statisch" gelernt zu haben. Englisch sagt mir, "statisch" ist unveränderlich, aber ich denke, das ist _leicht_ aus, da sich der Wert ändern kann. – Bobdabiulder

Antwort

2

A static Variable in die Klasse gehört, nicht das Objekt, so natürlich alle Ihre GameBoard s betroffen sind!

Nur weil Sie sich in einer statischen Methode befinden, heißt das nicht, dass Sie keine Instanzvariablen bearbeiten können. Machen Sie zuerst alles in Ihrer Klasse GameBoard nicht-statisch (es sei denn, Sie benötigen wirklich einige der Werte, die für alle Instanzen geteilt werden). Dies beinhaltet Ihre Instanzvariablen und Ihre Getter/Setter-Methoden.

Wenn Ihr Programm ausschließlich von der main Methode arbeitet, dann halten Sie Ihr GameBoard[] Objekt statisch.Dann, wenn Sie diese Methode Anruf:

gameboard[input].setState(2); 

Dies wird nur den Zustand der GameBoard bei Index input ändern.

Edit:

Um Ihre GameBoard[] mit grundlegenden GameBoard Objekte in der es instanziiert, können Sie dies Ihrer main Methode am Anfang tun:

for(int x=0; x<gameboard.length; x++) { 
    gameboard[x] = new GameBoard(); //Assuming you want to use the default constructor 
} 
+0

Funktioniert nicht. Ich bekomme eine Null-Zeiger-Ausnahme, wenn ich irgendeine nicht-statische Methode der anderen Klasse anrufe. Es tut uns leid. – Bobdabiulder

+0

Hast du jedes 'GameBoard' instanziiert? Denken Sie daran, 'GameBoard [] gameboard = new GameBoard [9] zu deklarieren;' erstellt nur ein Array, das 'GameBoard's enthält, aber das Array ist leer. – Zircon

+0

Vielen Dank! Das funktioniert einwandfrei! Jetzt kann ich das Spiel effektiver machen, einen Gewinn erkennen und schließlich eine funktionierende KI bekommen. :) :) – Bobdabiulder

1

Die anderen Objekte in Ihrem Array sollten nicht geändert werden. Können Sie mehr Code für mehr Kontext hinzufügen?

Soweit ich Sie verstehen können, Sie so etwas wie tun:

public class Main { 
    public static String[] strings = new String[2]; 

    public static void main(String[] args) { 
     strings[0] = "test"; 
     System.out.println(strings[1]); 
    } 
} 

In meinem Beispiel Ausgabe ist „null“ wie erwartet.

Wie werde ich all diese statische Elektrizität loswerden?

Erstellen Sie einfach Instanzen Ihrer Objekte in der Hauptfunktion.

GameBoard[] gameboard = new GameBoard[9];

1

Für das, was Sie beschreiben alle passieren Die Elemente des Gameboard-Arrays müssen auf dasselbe Objekt eingestellt sein (nichts, was mit dem Array zu tun hat). Überprüfen Sie Ihren Code, wo Sie das GameBoard-Array mit neuen Instanzen der GameBoard-Klasse für einen Fehler füllen, der denselben Fehler verursachen könnte Es muss in alle Elemente geschrieben werden (oder diesen Code hier posten, damit die Leute das Problem sehen können).