Pregunta

Cuando digo una cuadrícula, me refiero a una matriz multidimensional. Quiero esto porque estoy haciendo un juego 2D y quiero poder cargar niveles de los archivos de texto de datos. Digamos, por ejemplo, tengo esta matriz 2d level[3][3] Un simple mapa de 3x3. Y también tengo un archivo de texto que lee:

1 2 3 
4 5 6
7 8 9

En C ++, simplemente puedo hacer:

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

Y eso pondría todo el contenido del archivo de texto en consecuencia en la matriz. Sin embargo, no tengo idea de cómo hacer esto en Java. ¿Hay algún tipo de equivalente que solo coloque los datos en la matriz en consecuencia? Ya sé sobre la clase de escáner, pero no sé cómo usarla. He buscado en Google, en vano. No explica mucho. ¡Por favor ayuda! Específicamente, quiero saber cómo escanear el archivo y poner lo que se lea en el lugar apropiado en la matriz.

Mi código actual es este, sin embargo, arroja una ESUCHELEMEMEMECTIVE:

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();
        }
    }

Donde InputMap es el archivo, map[][] es una cuadrícula de datos para cada uno de los mosaicos en el mapa y el ancho y la altura se especifican previamente en un constructor.

¿Fue útil?

Solución

Su pregunta es muy inútil cuando se trata de cómo sus archivos de texto estarán realmente formateados. Por ejemplo,

123 
456
789

es muy diferente de

1 2 3
4 5 6
7 8 9

Y además, no has mencionado si siempre son ints, o

1 2 3
4 5 6
a b c

etc. Si nos dio una descripción precisa de exactamente lo que va en estos archivos de texto, podríamos ayudarlo más. Lo mejor que puedo hacer es mostrarle cómo usar el escáner para ingresar cosas en general:

El bucle for se vería similar en Java, pero debe inicializar un objeto de escáner.

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
    }
}

Más allá de eso, necesitaría saber más sobre lo que realmente está dentro de estos archivos de entrada.

EDITAR:

Copié su bucle for directamente desde su código, pero es posible que desee intercambiar el interior y el exterior por bucles. ¿No debería el ancho el parámetro interno (leer de izquierda a derecha)?

Otros consejos

En Java, funciona de manera similar: cree un java.util.Scanner objeto para su archivo y use su nextInt Método en lugar de FSCANF.

Si no conoces las dimensiones de la cuadrícula

    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);
    };
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top