Frage

Wenn ich ein Raster sage, meine ich ein mehrdimensionales Array. Ich möchte das, weil ich ein 2D -Spiel erstelle und in der Lage sein möchte, Ebenen aus Datentextdateien zu laden. Sagen wir zum Beispiel, ich habe dieses 2D -Array level[3][3]. Eine einfache 3x3 -Karte. Und ich habe auch eine Textdatei mit der Lautschaft:

1 2 3 
4 5 6
7 8 9

In C ++ kann ich einfach:

for (x=0; i<map_width; x++)
{
    for (y=0; y<map_height; y++)
    {
        fscanf(nameoffile, "%d", map[x][y]);
    }
}

Und das würde den gesamten Inhalt der Textdatei entsprechend in das Array einfügen. Ich habe jedoch keine Ahnung, wie ich das in Java machen soll. Gibt es ein Äquivalent, das die Daten nur entsprechend in das Array einbindet? Ich weiß bereits über die Scannerklasse, aber ich weiß nicht, wie ich sie benutzt. Ich habe Google ohne Erfolg gesucht. Es erklärt nicht viel. Bitte helfen Sie! Insbesondere möchte ich wissen, wie Sie die Datei scannen und alles in der entsprechenden Stelle im Array einstellen.

Mein aktueller Code ist jedoch, dass er eine NoSuchelementException auswirkt:

public void loadMap() {
    Scanner sc = null;
    try {
        sc = new Scanner(inputmap);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            map[x][y] = sc.nextInt();
        }
    }

Wobei InputMap die Datei ist, map[][] ist ein Datenraster für jede der Kacheln auf der Karte, und Breite und Höhe werden in einem Konstruktor vorgegeben.

War es hilfreich?

Lösung

Ihre Frage ist sehr nicht hilfreich, wenn es darum geht, wie Ihre Textdateien tatsächlich formatiert werden. Zum Beispiel,

123 
456
789

unterscheidet sich sehr von

1 2 3
4 5 6
7 8 9

Und außerdem haben Sie nicht erwähnt, ob sie immer int sind, oder

1 2 3
4 5 6
a b c

usw. Wenn Sie uns eine genaue Beschreibung dessen gegeben haben, was in diesen Textdateien entspricht, können wir Ihnen mehr helfen. Das Beste, was ich tun kann, ist zu zeigen, wie Sie Scanner verwenden, um Dinge im Allgemeinen einzugeben:

Die für die Schleife würde in Java ähnlich aussehen, aber Sie müssen ein Scannerobjekt initialisieren.

Scanner input = new Scanner(myFile); //whatever file is being read

for (x=0; i<map_width; x++)
{
    for (y=0; y<map_height; y++)
    {
        int nextTile = input.nextInt(); //reads the next int
        // or
        char nextTile = input.nextChar(); //reads the next char
    }
}

Darüber hinaus müsste ich mehr über das wissen, was sich tatsächlich in diesen Eingabedateien befindet.

BEARBEITEN:

Ich habe Ihre für Schleife direkt aus Ihrem Code kopiert, aber Sie möchten möglicherweise die Innen- und Außenschleifen gegen Schleifen austauschen. Sollte die Breite nicht der innere Parameter sein (von links nach rechts lesen)?

Andere Tipps

In Java funktioniert es ähnlich - erstellen Sie a java.util.Scanner Objekt für Ihre Datei und verwenden Sie sie nextInt Methode anstelle von FSCANF.

Wenn Sie die Dimensionen des Netzes nicht kennen

    static int[][] readFile(String filename) {
    try {
        File textfile = new File (GridSearchTest.class.classLoader.getResource(filename).toURI());
        Scanner fileScanner = new Scanner(textfile);
        int size = Integer.parseInt(fileScanner.next());
        String line = fileScanner.nextLine();
        int[][] grid = new int [size][size];
        int i = 0;  int j = 0;

        while (fileScanner.hasNextLine()) {
            line = fileScanner.nextLine();
            System.out.println (line);
            Scanner lineScanner = new Scanner(line);
            while (lineScanner.hasNext()) {
                grid[i][j] = Integer.parseInt(lineScanner.next());
                i++;
            }
            lineScanner.close();
            i=0;
            j++;
        }
        fileScanner.close();

        return grid;

    } catch (IOException e) {
        System.out.println("Error reading file: "+ e.getMessage());
        System.exit(0);
    };
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top