Java .txt Datei in einem Array einlesen

atlyaca

Newbie
Registriert
Dez. 2016
Beiträge
4
Hallo cb-Community,

mein Programm erstellt ein Array (Spielfeld) in dem man eine Variable (Spieler) mittels Konsoleneingaben wie z.B. up, down, left, right hin und her bewegen kann.

z.B.
@.... Konsoleneingabe right -> .@...

Nun möchte ich die Maps für dieses Spiel auf einer .txt Datei vorbereiten und diese einlesen. Dafür habe ich im Programm einen Bufferedreader eingebaut. Die map wird zwar eingelesen und ausgegeben, jedoch wird die map nicht vom Array übernommen. Sprich die Konsole gibt erstmal das Array und dann erst die map aus der .txt Datei aus.

Hoffe es ist alles verständlich erklärt. Falls nicht, einfach bitte fragen :)
Freue mich über jeden Ansatz.

Hier mein Quellcode:

Code:
// needed to use Scanner for user input

import java.util.Scanner;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * This class is the first part for the Sokoban game with a very simple rule set.
 *
 * @author Jane Doe 1234567 Group 42h
 * @author John Doe 1234567 Group 42h
 */
class SokobanTest {

    /**
     * The Main method for the Sokoban game with contains all of the game logic
     *
     * @param unused is unused
     */
    public static void main(String[] unused) {


        // player position (horizontal)
        int xPlayer = 0;
        // player position (vertical)
        int yPlayer = 0;

        // create room
        char[][] room = new char[5][3];


        BufferedReader br = null;
        String line;
        FileReader fr;

        try {
        br = new BufferedReader (new FileReader ("trivialmap.txt"));

            while((line = br.readLine())!= null ){
            System.out.println(line);
            }
        }
    catch (IOException e ) {
        e.printStackTrace();
    }


        // initialize room with dots
        //for (int x = 0; x < room.length; x++) {
        //    for (int y = 0; y < room[x].length; y++) {
        //        room[x][y] = '.';
        //    }
        //    }

        // set player start position in top left corner (origin)
        room[xPlayer][yPlayer] = '@';

        // create new Scanner that reads from console
        Scanner scan = new Scanner(System.in);

        // flag if we quit the program
        boolean run = true;

        do {
            // print room row for row (thats why we start with y instead of x)
            for (int y = 0; y < room[0].length; y++) {
                for (int x = 0; x < room.length; x++) {
                    System.out.print(room[x][y]);
                }
                System.out.println();
            }

            System.out.println("Do you want to go up, down, left, right or exit the program?");

            // check which command was chosen and execute it
            switch (scan.next()) {
                case "w":
                case "up":
                    if (yPlayer > 0) {
                        room[xPlayer][yPlayer] = ' '; // set dot on old player position
                        yPlayer--; // move player to new place
                        room[xPlayer][yPlayer] = '@'; // set new player position
                    } else {
                        System.out.println("You can not go there!");
                    }
                    break;
                case "s":
                case "down":
                    if (yPlayer < room[0].length - 1) {
                        room[xPlayer][yPlayer] = ' ';
                        yPlayer++;
                        room[xPlayer][yPlayer] = '@';
                    } else {
                        System.out.println("You can not go there!");
                    }
                    break;
                case "a":
                case "left":
                    if (xPlayer > 0) {
                        room[xPlayer][yPlayer] = ' ';
                        xPlayer--;
                        room[xPlayer][yPlayer] = '@';
                    } else {
                        System.out.println("You can not go there!");
                    }
                    break;
                case "d":
                case "right":
                    if (xPlayer < room.length - 1) {
                        room[xPlayer][yPlayer] = ' ';
                        xPlayer++;
                        room[xPlayer][yPlayer] = '@';
                    } else {
                        System.out.println("You can not go there!");
                    }
                    break;
                case "exit":
                    run = false;
                    break;
                // if the user input is not one of our commands print help
                default:
                    System.out.println("Command unknown! Please type up, down, left or right to move or exit to quit this program");
            }
        } while (run);
        System.out.println("Goodbye");
        

    }
}
 
Richtig Zeile 41 statt es auszugeben musst Du es in das Array packen. Oder beides, wenn Du die Konsolenausgabe weiterhin haben möchtest.

Ich denke Du bist noch in der Experimentierphase, dennoch ein paar Hinweise:

This class is the first part for the Sokoban game with a very simple rule set.
The Main method for the Sokoban game with contains all of the game logic

Wenn ich das lese kräuselt sich bei mir alles. Die Main Methode enthält in der Regel keine Logik außer Initialisierung und evtl. bei fortgeschrittenen Games den Basic GameLoop. Mach für das Game eine eigene Klasse, SokobanGame z.B.

Die Main Methode instantiiert die Klasse dann. Der Konstruktor initialisiert das Spielfeld. Dann machst Du einzelne Methoden, die die möglichen Spielzüge implementieren, z.B. MovePlayer.

Dann machst Du eine Methode, die die User Eingaben interpretiert und dann den passenden Spielzug aufruft, dieser prüft dann wiederum ob das ein legaler Zug ist etc.

Aber das ist ein ziemliche Spaghetti Code den Du da geschrieben hast.
 
Um es dir einfacher mit dem Parsen zu machen, waere es vielleicht einfacher in einer XML/JSON die Arten der Felder zu speichern und die dazugehoerige Position.
 
Um gar nicht erst parsen zu müssen, könnte man Protobuf oder Konsorten nutzen. Riesig werden die Dateien wohl nicht sein?
 
Zurück
Oben