Primero lo primero, me disculpo si el título es engañoso. Me gustaría implementar mi propia versión de Buscaminas en Java. Cuando creé una matriz de objetos y probé una de mis funciones, obtuve una NullPointerException. Desbordamiento de pila de navegación Logré resolver mi problema. Sin embargo, resulta que la matriz primero debe ser instanciada y luego inicializada. Entonces, lo que pregunto es lo siguiente: ¿Puedo crear una instancia de una matriz de objetos e inicializarla al mismo tiempo?

MineSweeperMain.java

public class MineSweeperMain {
    public static void main(String[] args) {
        MineSweeper ms = new MineSweeper(9,9);
        int test;
        for (int i=0;i<9;i++)
            for (int j=0;j<9;j++)
            {
                ms.tile[i][j]=new Tile(); // can I initialize the array in the same line that I am instantiating it using the default constructor? 
            }
        test = ms.tile[0][0].getNeighbours();
        System.out.println("Test: " + test);
    }
}

Tile.java

public class Tile {
    int numNeighbours;
    boolean hasBomb;

    Tile() {
        numNeighbours = 0;
        hasBomb = false;
    }


    int getNeighbours() {
        return numNeighbours;
    }

    boolean hasBomb() {
        return hasBomb;
    }
}

Minesweeper.java

public class MineSweeper {
    Tile tile[][];

    MineSweeper(int x,int y) {
        tile = new Tile[x][y];
    }
}

Gracias.

EDITAR: Usar tile[9][9](); tampoco funciona.

0
John M. 9 may. 2019 a las 20:44

3 respuestas

La mejor respuesta

Tal vez esto es lo que estás tratando de hacer ...

 public static void main(String[] args) {
        MineSweeper ms = new MineSweeper(9,9);
        int test;
        // remove code here
        test = ms.tile[0][0].getNeighbours();
        System.out.println("Test: " + test);
    }

public class MineSweeper {
    Tile tile[][];

    MineSweeper(int x,int y) {
        tile = new Tile[x][y];
        // create Tiles here
        for (int i=0;i<x;i++)
            for (int j=0;j<y;j++)
                tile[i][j]=new Tile();
    }
}
2
Doc 9 may. 2019 a las 18:34

Primero, no hay nada de malo con 2 bucles for anidados para llenar elementos de su matriz bidimensional.

Sin embargo, es posible usar flujos Java para generar nuevos mosaicos en una matriz 2D.

Comience con el código para Stream para generar una matriz 1D de Tile s.

Tile[] oneDArray = Stream.generate(Tile::new).limit(9).toArray(Tile[]::new);

Luego puede usar esa expresión para decirle a un Stream externo cómo generar matrices unidimensionales como parte de la matriz bidimensional general.

Tile[][] tile = Stream.<Tile[]>generate(
        () -> Stream.generate(Tile::new).limit(x).toArray(Tile[]::new)
    ).limit(y).toArray(Tile[][]::new);

Para fines de inferencia de tipo, tuve que proporcionar el argumento de tipo Tile[] explícitamente.

Lo he escrito como líneas múltiples, pero es todo una declaración. De cualquier forma que elija, los bucles for anidados o esta solución de transmisión, el código también se puede mover a su constructor Minesweeper para que esté oculto del código main.

1
rgettman 9 may. 2019 a las 18:56

Use una ArrayList. Dentro de tu clase de buscaminas debería vivir una lista de mosaicos. Haga que el constructor de Buscaminas invoque un método que llene la matriz de listas con mosaicos. Dele a cada mosaico una coordenada X e Y. Luego, para obtener vecinos, simplemente recorra la lista de mosaicos y tyle.getX y tyle.getY para determinar si se encuentra ... o si es una bomba ... o si ya se volcó.

Azulejos ArrayList = nueva ArrayList ();

Para.....

Mosaico de mosaico = nuevo mosaico (X, Y)

Tiles.add (azulejo)

0
Roger 9 may. 2019 a las 18:04