• Hallo,

    ich habe ein Problem in meinem Java-Code.
    Ich erzeuge (siehe rote Schrift) ein neues Spielfeld. Grid ist ein Interface.

    Dann möchte ich auf die Methode setAlive(int j, int k) des Interfaces zugreifen.
    Diese soll die Zelle (j,k) im erzeugten Spielfeld auf lebendig setzen.
    Der Compiler beschwert sich aber, weil "game" nicht "visible" (sichtbar) ist.
    Liegt wahrscheinlich an der if- Anweisung.

    Ich hab das ganze schon x-mal umgeschrieben und komm nicht drauf wie ichs am besten machen könnte.
    Kann mir evtl jemand helfen
    Danke!





    private static void execute() throws IOException {
    boolean start = false;
    boolean quit = false;

    while (!quit) {
    System.out.print("gol> ");
    String input = cons.readLine(); // read one line

    // split input on white spaces

    String[] tokens = input.trim().split(

    "\\s+");

    // Uppercase or lowercase letters should be no matter

    String i = tokens[0];
    i = i.toLowerCase();

    // First letter of the command is equal. The command n.. x y

    // starts a new play with x rows and y columns

    if (i.startsWith("n")) {
    if (tokens.length != 3) { // expected length?

    System.

    out.println("Error! Bitte zwei Zahlen eingeben!");
    continue;
    }

    // The input has to be consist of two integers

    int j = Integer.parseInt(tokens[1]);
    int k = Integer.parseInt(tokens[2]);
    Grid game = new GameOfLife(j,k);

    start = true;

    }
    else if (i.startsWith("a") && start == true){
    int j = Integer.parseInt(tokens[1]);
    int k = Integer.parseInt(tokens[2]);
    game.setAlive(j,k);


    }

  • Grundstruktur:

    PHP
    if(...) {
        Grid game = ...
    }
    elseif (...) {
        game.setAlive(...);
    }

    Wie soll denn das gehen?

  • Es handelt sich insgesamt um einen Spielablauf:

    Beginnt das eingegebene Kommando mit " n "

    so wird ein neues Spielfeld angelegt:

    Grid game = new Game (j,k)


    Dann (wenn das Feld angelegt ist) kann man auf dem Feld (2-dim. Array) eine Zelle auf lebendig setzen mit

    game.setAlive(a,b)



    Mein Problem ist aber, dass "game" in den späteren Anweisungen nicht mehr sichtabar ist. Wahrscheinlich wegen der if-Anweisung.

    Die if-Unterscheidungen brauch ich aber, da noch mehr befehle kommen.
    z.b. wenn der erste Buchstabe ein "h" ist soll einen Hilfe aufgerufen werden etc..

  • ja das hab ich auch verstanden.
    Aber ich bräuchte eine möglichkeit wie man das anders lösen könnte.
    ich hab wie oben schon erwähnt, schon zig-möglichkeiten probiert und auf nichts brauchbares gekommen.

  • Aber ich bräuchte eine möglichkeit wie man das anders lösen könnte.

    Ich würde das Game-Objekt noch vor der Schleife erstellen.


  • ich hab wie oben schon erwähnt, schon zig-möglichkeiten probiert und auf nichts brauchbares gekommen.

    Wäre interessant, was du da genau ausprobiert hast, aber ich denke, wenn du verstanden hättest, wo das Problem liegt, wärst du auch auf die Lösung gekommen: Game muss einfach vor der if-Anweisung deklariert werden.

    EDIT: verdammt, zu langsam.

    There's no better place than 127.0.0.1!

  • HI,

    die Vorschlag von Paulchen geht auch nicht.
    Ich hol mal etwas weiter aus.

    Der Spielablauf ist so:

    Als erstes muss man ein Spielfeld erzeugen, eben durch
    Grid game = new GameOfLife (j,k)
    j und k kann der Benutzer selbst eingeben durch das Kommando n j k

    Wenn ein Spielfeld angelegt ist (!nur dann!) kann man eine Zelle des Feldes auf lebendig setzen durch das Kommando a 2 4 zum Beispiel.

    Natürlich gibts noch weitere Funktionen, die hab ich aber nicht aufgelistet.

    Wichtig:

    Man kann das Spiel jederzeit beenden durch das kommando "q"
    Man kann jederzeit die Hilfe aufrufen durch "h"

    Diese beiden kommandos können evtl auch vor dem erzeugen eines neuen Feldes aufgerufen werden!

    Insgesamt also:

    Man kann die Befehle n, q, h jederzeit aufrufen. a aber nur, wenn Befehl n bereits ausgeführt wurde.

    Das ganze vor der while-Schleife zum machen geht ja auch nicht, weil da der Benutzer noch keine Eingaben machen kann.


    Ps. Hier handelt es sich um die Implementation des Spieles GameOfLife

  • Machs so wie ich gesagt hab, deklariere game vor der berüchtigten if-Anweisung.
    Ich bin zwar der Meinung dass du noch ein paar andere Fehler drinnen hast, aber zumindest ist so der Compilerfehler weg.

    There's no better place than 127.0.0.1!

  • Du willst also sowas:

  • Hi,

    @ java-Girl: Genau das geht ja nicht. Was soll ich denn dann für Parameter übergeben?
    Grid game;

    if(i.startsWith("n")){
    int j= ..
    int k = ...
    game = new GameOfLife(j,k)

    Dann beschwert er sich später:
    The local Variable game may not have been initalisized.

    Ich poste hier nochmal den ganzen Code.
    Zur Erläuterung:
    Grid ist ein Interface, das die GameOfLife implementiert.
    Der Zugriff darf nur über das Interface erfolgen!

    Die Problemstellen sind rot markiert.

    public static void main(String[] args) throws IOException {
    cons = new BufferedReader(new InputStreamReader(System.in));
    execute();

    } // void main

    private static void execute() throws IOException {
    boolean start = false;
    boolean quit = false;

    while (!quit) {

    System.out.print("gol> ");
    String input = cons.readLine(); // read one line

    if (input == null) { // no more input?

    break;
    }

    // split input on white spaces

    String[] tokens = input.trim().split(

    "\\s+");

    // Uppercase or lowercase letters should be no matter

    String i = tokens[0];
    i = i.toLowerCase();

    // First letter of the command is crucial. The command n.. x y

    // starts a new play with x rows and y columns

    if (i.startsWith("n")) {
    if (tokens.length != 3) { // expected length?

    System.

    out.println("Error! Bitte zwei Zahlen eingeben!");
    continue;
    }
    int j = Integer.parseInt(tokens[1]);
    int k = Integer.parseInt(tokens[2]);
    Grid game = new GameOfLife(j, k);

    start = true;
    }
    // eine zelle auf lebendig setzen

    if (i.startsWith("a") && start == true) {
    int m = Integer.parseInt(tokens[1]);
    int n = Integer.parseInt(tokens[2]);
    game.setAlive(m, n, true);
    }

    // Anzeigen des Spielfeldes

    if (i.startsWith("p") && start == true) {
    game.toString();
    }
    // Hillfe aufrufen

    if (i.startsWith("h")) {
    System.out.println("Hilfe");
    }
    // spiel beenden

    if (i.startsWith("q")) {
    quit = true;
    }

    else {
    System.out.println("Error! Bitte als erstes ein Spielfeld "

    +

    "anlegen, die Hilfe aufrufen oder das "

    +

    "Programm beenden!");
    }
    } // while


    }

    // void execute


    }

    // class Shell

  • Also so: (Geht aber auch nicht)

    Fehlermeldung: The local variable game may not have been initalisized!

    Einmal editiert, zuletzt von kru (22. November 2008 um 18:25)


  • Fehlermeldung: The local variable game may not have been initalisized!

    Ist ja auch logisch.
    Ich habe nicht gesagt, dass du sie unmittelbar davor deklarieren sollst. Paulchen hat dir bereits ein Grundgerüst gegeben, wo liegt jetzt das Problem, das umzusetzen? Er hat es so gemacht, wie ich auch gesagt habe, game vor dem if deklariert.

    There's no better place than 127.0.0.1!

  • Habs ja vor dem if deklariert. hier als beweis:

    [/align]
    [/SIZE]

  • Habs ja vor dem if deklariert. hier als beweis:

    Ja und so wie du es gemacht hast ist es eindeutig falsch.

    Code
    Grid game;
    if(...){
    	...
    	game = new Grid(...);
    }
    else{
    	...
    	game.doSomething();
    }

    Wie soll das funktionieren? Jetzt überleg einmal was passiert wenn er ins else geht?!
    Ich lege dir noch einmal nahe, dir Paulchens Gerüst anzusehen und dein Programm dementsprechend abzuändern.

    There's no better place than 127.0.0.1!

  • Ich hab mich jetzt an Paulchens Grundgerüst gehalten.

    [/COLOR][/SIZE]

    Fehlermeldung: The local variable game may not have been initalisized[/align]

  • Ich bin der Meinung, du solltest die Zeit dazu nutzen, um zu verstehen, was die Fehlermeldung bedeutet und warum sie kommt anstatt wild irgendwas herumzuprobieren.

    There's no better place than 127.0.0.1!

  • Programmierst du gerade das "Game of Live"-Beispiel aus dem Schiedermeier Buch aus?^^

    Lösche bitte deinen Code, und überleg dir das ganze nochmal ruhig von vorne:
    Das Interface Grid wird, soweit ich mich erinnern kann, dafür verwendet, verschiedene Startbelegungen definieren zu können. Oder?

    Schreib doch kurz eine Zusammenfassung der Aufgabenstellung hier rein, und dann noch kurz, was du dir dazu überlegt hast. Dann können wir dir eher auf die richtige Fährte helfen. Wenn mich meine Erinnerung nicht ganz täuscht, hast du nämlich die Aufgabenstellung schon gar nicht richtig verstanden. :)

    Für mich denkt mdk!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!