Erste Schritte txt.Datei mit BufferedReader einlesen und in 2D-Array abspeichern

elito190

Mitglied
Guten Abend,
vielleicht kann mir ja hier jemand helfen. Ich probiere schon seit 10 Stunden das Problem zu lösen:
Ich will eine txt-datei einlesen was auch geklappt hat. Diese habe ich mit einem 2D-char-Array eingelesen. Jetzt will ich dieses Array verwenden und die Variablen verschieben. Ich hab versucht das Array zu kopieren, damit es die Veränderungen anzeigt und nicht immer wieder aus der Datei ausliest. Ich bekomme es jedoch einfach nicht hin. Mein Code-Ausschnitt bisher:

Java:
public static void main(String[] args) throws IOException {
   File f = new File("datei.txt");
   System.out.println(f.getAbsolutePath());

   String fileName = "C:\\Users\\Tiger\\Desktop\\datei.txt";
   File file = new File(fileName);
   FileReader fr = new FileReader(file);
   br = new BufferedReader(fr);

   for (int code = br.read(); code >= 0; code = br.read()) {
     char ch = (char) code;
     chars++; // Gesamtanzahl der Chars
     if (ch == '\n') {
       lines++; // Zeilenanzahl
     }
   }
   System.out.println(lines + " " + chars);

   zeile = lines + 1;
   spalte = chars / lines;
   System.out.println(zeile + " " + spalte);

   String fileName2 = "C:\\Users\\Tiger\\Desktop\\datei.txt";
   File file2 = new File(fileName2);
   FileReader fr2 = new FileReader(file2);
   br = new BufferedReader(fr2);
   char[] read;

   char[][] room = new char[spalte][zeile]; // Array erstellen

   while ((text = br.readLine()) != null) {
     read = text.toCharArray();

     for (z = 0; z < read.length; z++) {
       room[z][s] = read[z];
       if (room[z][s] == 40) { // ASCII-Code hex für@
         spieler = '@';
       } else if (room[z][s] == ' ') {
         feld = ' ';
       } else if (room[z][s] == 24) { // ASCII-Code hex für$
         kiste = '$';
       } else if (room[z][s] == '.') {
         zielfeld = '.';
       } else if (room[z][s] == '#') {
         wand = '#';
       }
       System.out.print(room[z][s]);
     }
     System.out.print("\n");
   }

   while (beendet == !true) {
     String eingabe;
     eingabe = scan.next();

     for (int i = 0; i < room.length; i++) {
       for (int j = 0; j < room[z][s].length; j++) {
         System.out.println(room[z][s]);
       }
       System.out.print("\n");
     }

     if (room[z][s] == kiste && room[z][s] == zielfeld) {
       beendet = true;
       System.out.println("JA");
     }

     switch (eingabe) {
       case "up":
         /*
         * um eine Stelle höher zu gehen muss die Zeilen-Höhe 1
         * abgezogen werden
         */
         spieler = room[z][s];
         if (room[z - 1][s] == feld) {
           room[z - 1][s] = feld;
           spieler = room[z];
           room[z][s] = room[z--];
           room[z][s] = spieler;
           room[z + 1] = feld;
         } else if (room[z - 1][s] == zielfeld) {
           room[z - 1][s] = zielfeld;
           spieler = room[z - 1][s];
           room[z - 1][s] = spaufzf;
           room[z + 1][s] = feld;
           room[z--][s] = spieler;
         } else if (room[z - 1][s] == kiste) {
           room[z - 1][s] = kiste;
           room[z][s] = room[z--][s];
           room[z - 1][s] = kiste;
           room[z][s] = spieler;
           room[z + 1][s] = feld;
         } else if (room[z - 1][s] == wand) {
           room[z - 1][s] = wand;
           spieler = room[z][s];
         }
         break;

       case "down":
         /*
         * um eine Stelle höher zu gehen muss die Zeilen-Höhe um 1
         * addiert werden
         */
         spieler = room[z][s];
         if (room[z + 1][s] == feld) {
           room[z + 1][s] = feld;
           spieler = room[z][s];
           room[z][s] = room[z++][s];
           room[z][s] = spieler;
           room[z - 1][s] = feld;
         } else if (room[z + 1][s] == kiste) {
           room[z + 1][s] = kiste;
           room[z][s] = room[z++][s];
           room[z + 1][s] = kiste;
           room[z][s] = spieler;
           room[z - 1][s] = feld;
         } else if (room[z + 1][s] == wand) {
           room[z + 1][s] = wand;
           spieler = room[z][s];
         }
         break;

       case "left":
         /*
         * um eine Stelle nach links zu gehen muss die Spalten-Höhe um 1
         * abgezogen werden
         */
         spieler = room[z][s];
         if (room[z][s - 1] == feld) {
           room[z][s - 1] = feld;
           spieler = room[z][s];
           room[z][s] = room[z][s--];
           room[z][s] = spieler;
           room[z][s + 1] = feld;
         } else if (room[z][s - 1] == kiste) {
           room[z][s - 1] = kiste;
           room[z][s] = room[z][s--];
           room[z][s - 1] = kiste;
           room[z][s] = spieler;
           room[z][s + 1] = feld;
         } else if (room[z][s - 1] == '#') {
           room[z][s - 1] = wand;
           spieler = room[z][s];
         }
         break;

       case "right":
         /*
         * um eine Stelle nach rechts zu gehen muss die Spalten-Höhe um
         * 1 addiert werden
         */
         spieler = room[z][s];
         if (room[z][s + 1] == feld) {
           room[z][s + 1] = feld;
           spieler = room[z][s];
           room[z][s] = room[z][s++];
           room[z][s] = spieler;
           room[z][s - 1] = feld;
         } else if (room[z][s + 1] == kiste) {
           room[z][s + 1] = kiste;
           room[z][s] = room[z][s++];
           room[z][s + 1] = kiste;
           room[z][s] = spieler;
           room[z][s - 1] = feld;
         } else if (room[z][s + 1] == wand) {
           room[z][s + 1] = wand;
           spieler = room[z][s];
         }
         break;

       case "exit":
         /*
         * um das Programm zu beenden wird der boolean-Wert auf
         * beendet:true gesetzt und somit die while-Schleife geschlossen
         */
         System.out.print("Spielende!");
         beendet = true;
         break;
       default:
         System.out.println("Falsche Eingabe!");
         /*
         * sollte etwas eingegeben werden was keinem Befehl entspricht
         * wird dies ausgegeben
         */
     }

   }
}
 
Zuletzt bearbeitet von einem Moderator:
Code bitte in Code-Tags posten, danke! 🙂
[code=java] .. dein code ..[/code]
Es kann sein das ein paar [s] verloren gegangen sind, bitte kontrolliere den Code nochmal.

Wo werden denn die Variablen z und s deklariert?
Die Variablen werden irgendwie nie verändert.

Jetzt will ich dieses Array verwenden und die Variablen verschieben.
Welche Variablen willst du verschieben? Wohin verschieben? Gibt doch am besten ein kleines Beispiel an 😉

Bitte mach doch auf beendet == !true einfach beendet == false
 
Zuletzt bearbeitet:
Oh super danke, hast recht jetzt ist es bisschen übersichtlicher 😀
eigentlich ist meine Frage nur wie ich mein eingelesenes Array in ein neues Kopiere was im Programm abgespeichert wird🙁
 
eigentlich ist meine Frage nur wie ich mein eingelesenes Array in ein neues Kopiere was im Programm abgespeichert wird🙁
Warum willst du es denn kopieren?
Da bleibt dir nichts anderes über als ein neues Array zu erstellen das genauso groß ist und jedes Element einzeln zu kopieren.

Wo werden denn all deine Variablen deklariert?

Folgender Bedingung kann nie zutreffen! ->if (room[z][s] == kiste && room[z][s] == zielfeld) {
Ein char kann immer nur einen Wert haben, sofern zielfeld und kiste nicht den selben Wert haben trifft die Bedingung nie zu![/s][/s]
 
Zuletzt bearbeitet:
Ich dachte das Array zu kopieren wäre eine gute Lösung😕
ich will praktisch in dem Array mit dem Spieler(@) mich bewegen (mit den befehlen left,up...) und dann das Array ausgeben wohin er sich bewegt hat. Und wenn die Kiste auf das Zielfeld geschoben wurde soll das Spiel vorbei sein. Deswegen die if Bedingung. Die Variablen hatte ich vergessen hinzuzufügen
Java:
static char spieler, wand, kiste, zielfeld, feld, spaufzf, kiaufzf;

    static int spalte, zeile;
    static int z, s, chars, lines;
    static boolean beendet = false;
    static Scanner scan = new Scanner(System.in);
    static BufferedReader br = null;
    static String text;
 
Zuletzt bearbeitet:
Ich dachte das Array zu kopieren wäre eine gute Lösung😕
Eine Lösung für welches Problem?

ich will praktisch in dem Array mit dem Spieler(@) mich bewegen (mit den befehlen left,up...) und dann das Array ausgeben wohin er sich bewegt hat.
Ok dachte ich mir fast 🙂

Und wenn die Kiste auf das Zielfeld geschoben wurde soll das Spiel vorbei sein. Deswegen die if Bedingung
Ja wie schon gesagt, ein char kann nur einen Wert annehmen (bzw. ein Zeichen darstellen), du vergleichst aber ob er 2 verschiedene Werte hat. In deinem Code legst du fest das die Kiste durch ein "$" dargestellt wird und das Zielfeld durch einen "."
Lösung dafür: merke die die Koordinaten des Zielfeldes (dieses kannst du auch weiter durch einen "." darstellen) und dann kontrolliere nur ob auf den Koordinaten des Zielfelds das "$" steht.

Was ist denn nun eigentlich dein Problem? 🙂
 
Mein Problem ist, dass ich nicht weiß wie ich die Befehle (right,left...)auf das Array anwenden kann

Du musst dir speichern wo dein Spieler steht, dazu brauchst du 2 Variablen (z.B.: spielerXKoordinate und spielerYKoordinate).
Je nachdem in welche Richtung du dich bewegst musst du eine der Variablen erhöhen oder vermindern, dann hast du die neue Position des Spielers.

Probiere erstmal nur die Bewegung deines Spielers zu realisieren, erst wenn diese klappt baue nach und nach die weiteren Sachen ein.

Pseudocode für die while-Schleife (nur Spielerbewegung)
Java:
while(running) {
  richtung = eingabe lesen;

  prüfen ob spieler sich in richtung bewegen kann
  wenn ja
  spielerposition = ' '; // auf leer setzen
  spielerkoordinaten ändern
  neue spielerposition = '@';
  wenn nein
  meldung ausgeben;

  spielfeld ausgeben
}

und wie ich nach jedem Befehl das Array mit den Veränderungen der Positionen auf der Konsole ausgeben kann 😕
Du hast doch schon den Code um dein Array auszugeben
Java:
for (int i = 0; i < room.length; i++) {
for (int j = 0; j < room[z].length; j++) {
System.out.println(room[z][s]);
}
System.out.print("\n");
}
Der einzige Fehler ist dass du in der inneren Schleife auf room[z][S] zugreifen willst.
Verwende doch besser "i" und "j" 😉[/S]
 
Zuletzt bearbeitet:
Der einzige Fehler ist dass du in der inneren Schleife auf room[z][S] zugreifen willst.
Verwende doch besser "i" und "j" 😉[/S]
der Erste Abschnitt leuchtet mir ein vielen Dank schon mal dafür 🙂. Beim zweiten Teil mit dem Array ausgeben habe ich schon alle möglichen Kombinationen mit z,s,i und j probiert aber das wirft er mir nicht richtig aus🙁
 
Beim zweiten Teil mit dem Array ausgeben habe ich schon alle möglichen Kombinationen mit z,s,i und j probiert aber das wirft er mir nicht richtig aus🙁
So müsste es lauten:
Java:
for (int i = 0; i < room.length; i++) {
  for (int j = 0; j < room[z].length; j++) {
  System.out.println(room[i][j]);
  }
  System.out.print("\n");
}
 
Vielen Dank für deine Bemühungen. So hatte ich es auch zuerst probiert. Dann gibt er mir jedoch nur das erste Zeichen aus.🙁
Scheine wohl etwas grundlegenderes falsch gemacht zu haben😕
 
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import java.util.Scanner;

public class Sokoban {
    static char spieler, wand, kiste, zielfeld, feld, spaufzf, kiaufzf;

    static int spalte, zeile;
    static int z, s, chars, lines;
    static boolean beendet = false;
    static Scanner scan = new Scanner(System.in);
    static BufferedReader br = null;
    static String text;

    public static void main(String[] args) throws IOException {

        File f = new File("datei.txt");
        System.out.println(f.getAbsolutePath());

        String fileName = "C:\\Users\\Tiger\\Desktop\\datei.txt";
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        br = new BufferedReader(fr);

        for (int code = br.read(); code >= 0; code = br.read()) {
            char ch = (char) code;
            chars++; // Gesamtanzahl der Chars

            if (ch == '\n') {
                lines++; // Zeilenanzahl
            }
        }
        System.out.println(lines + " " + chars);

        zeile = lines + 1;
        spalte = chars / lines;
        System.out.println(zeile + " " + spalte);

        String fileName2 = "C:\\Users\\Tiger\\Desktop\\datei.txt";
        File file2 = new File(fileName2);
        FileReader fr2 = new FileReader(file2);
        br = new BufferedReader(fr2);
        char[] read;

        char[][] room = new char[spalte][zeile]; // Array erstellen

        while ((text = br.readLine()) != null) {
            read = text.toCharArray();

            for (z = 0; z < read.length; z++) {
                room[z][s] = read[z];
                if (room[z][s] == 40) { // ASCII-Code hex für@
                    spieler = '@';
                } else if (room[z][s] == ' ') {
                    feld = ' ';
                } else if (room[z][s] == 24) { // ASCII-Code hex für$
                    kiste = '$';
                } else if (room[z][s] == '.') {
                    zielfeld = '.';
                } else if (room[z][s] == '#') {
                    wand = '#';
                }
                System.out.print(room[z][s]);

            }

            System.out.print("\n");

        }
       
       

        while (beendet == false) {
            String eingabe;
            eingabe = scan.next();

            for (int i = 0; i < room.length; i++) {
                 for (int j = 0; j < room[z].length; j++) {
                 System.out.println(room[i][j]);
                 }
                 System.out.print("\n");
                }
            if (room[z][s] == kiste && room[z][s] == zielfeld) {
                beendet = true;
                System.out.println("JA");
            }

            switch (eingabe) {

            case "up":
                /*
                * um eine Stelle höher zu gehen muss die Zeilen-Höhe 1
                * abgezogen werden
                */

                spieler = room[z][s];
                if (room[z - 1][s] == feld) {
                    room[z - 1][s] = feld;
                    spieler = room[z][s];
                    room[z][s] = room[z--][s];
                    room[z][s] = spieler;
                    room[z + 1][s] = feld;
                } else if (room[z - 1][s] == zielfeld) {
                    room[z - 1][s] = zielfeld;
                    spieler = room[z - 1][s];
                    room[z - 1][s] = spaufzf;
                    room[z + 1][s] = feld;
                    room[z--][s] = spieler;

                } else if (room[z - 1][s] == kiste) {
                    room[z - 1][s] = kiste;
                    room[z][s] = room[z--][s];
                    room[z - 1][s] = kiste;
                    room[z][s] = spieler;
                    room[z + 1][s] = feld;

                } else if (room[z - 1][s] == wand) {
                    room[z - 1][s] = wand;
                    spieler = room[z][s];

                }
                break;

            case "down":
                /*
                * um eine Stelle höher zu gehen muss die Zeilen-Höhe um 1
                * addiert werden
                */

                spieler = room[z][s];

                if (room[z + 1][s] == feld) {
                    room[z + 1][s] = feld;
                    spieler = room[z][s];
                    room[z][s] = room[z++][s];
                    room[z][s] = spieler;
                    room[z - 1][s] = feld;
                } else if (room[z + 1][s] == kiste) {
                    room[z + 1][s] = kiste;
                    room[z][s] = room[z++][s];
                    room[z + 1][s] = kiste;
                    room[z][s] = spieler;
                    room[z - 1][s] = feld;

                } else if (room[z + 1][s] == wand) {
                    room[z + 1][s] = wand;
                    spieler = room[z][s];

                }
                break;

            case "left":
                /*
                * um eine Stelle nach links zu gehen muss die Spalten-Höhe um 1
                * abgezogen werden
                */

                spieler = room[z][s];
                if (room[z][s - 1] == feld) {
                    room[z][s - 1] = feld;
                    spieler = room[z][s];
                    room[z][s] = room[z][s--];
                    room[z][s] = spieler;
                    room[z][s + 1] = feld;
                } else if (room[z][s - 1] == kiste) {
                    room[z][s - 1] = kiste;
                    room[z][s] = room[z][s--];
                    room[z][s - 1] = kiste;
                    room[z][s] = spieler;
                    room[z][s + 1] = feld;

                } else if (room[z][s - 1] == '#') {
                    room[z][s - 1] = wand;
                    spieler = room[z][s];

                }
                break;

            case "right":
                /*
                * um eine Stelle nach rechts zu gehen muss die Spalten-Höhe um
                * 1 addiert werden
                */

                spieler = room[z][s];

                if (room[z][s + 1] == feld) {
                    room[z][s + 1] = feld;
                    spieler = room[z][s];
                    room[z][s] = room[z][s++];
                    room[z][s] = spieler;
                    room[z][s - 1] = feld;
                } else if (room[z][s + 1] == kiste) {
                    room[z][s + 1] = kiste;
                    room[z][s] = room[z][s++];
                    room[z][s + 1] = kiste;
                    room[z][s] = spieler;
                    room[z][s - 1] = feld;

                } else if (room[z][s + 1] == wand) {
                    room[z][s + 1] = wand;
                    spieler = room[z][s];
                }

                break;

            case "exit":
                /*
                * um das Programm zu beenden wird der boolean-Wert auf
                * beendet:true gesetzt und somit die while-Schleife geschlossen
                */
                System.out.print("Spielende!");
                beendet = true;
                break;
            default:
                System.out.println("Falsche Eingabe!");
                /*
                * sollte etwas eingegeben werden was keinem Befehl entspricht
                * wird dies ausgegeben
                */

            }

        }
    }
}
 
Das Problem warum dir nur ein Zeichen angezeigt wird wenn du dein Feld ausgeben willst, ist dass du es nicht korrekt befüllst 😉
Java:
while ((text = br.readLine()) != null) {
  read = text.toCharArray();

  for (z = 0; z < read.length; z++) {
    room[z][s] = read[z];
    if (room[z][s] == 40) { // ASCII-Code hex für@
      spieler = '@';
    } else if (room[z][s] == ' ') {
      feld = ' ';
    } else if (room[z][s] == 24) { // ASCII-Code hex für$
      kiste = '$';
    } else if (room[z][s] == '.') {
      zielfeld = '.';
    } else if (room[z][s] == '#') {
      wand = '#';
    }
    System.out.print(room[z][s]);
  }
  System.out.print("\n");
}
Das Problem ist du weist immer room[z][s] ein Zeichen zu, änderst aber nur die Variable z, s bleibt immer gleich.
Du musst dir überlegen wie du "z" UND "s" erhöhst so dass das ganze Array gefüllt wird.

Was ich nicht verstehe ist, welchen Zweck das if/else Konstrukt haben soll.
Weise doch den Variablen spieler, kiste, zielfeld, wand und feld ihre Werte direkt bei der Deklaration zu.
In dieser Schleife solltest du nur noch die Position vom Spieler, der Kiste und dem Ziel abfragen und speichern.[/s]
 
Das if else Konstrukt habe ich jetzt geändert, danke.
Mit dem Array habe ich noch meine Probleme, da ich das einfache Array ja in einen 2D-Array überschreibe. Welchen Wert erhält s denn dann?😕 Vielleicht habe ich auch schon meine Augen zu lange auf dem Bildschirm😀
 
Java:
for (z = 0; z < room.length; z++) {
                for (s = 0; s < room[z].length;s++) {
                room[z][s] = read[z];

                }

das wäre mein logisches Resultat funktioniert aber auch nicht 🙁
 

Neue Themen


Zurück
Oben