JavaFX如何修复stream()

时间:2016-11-14 08:02:22

标签: javafx filter java-stream minesweeper

我正在制作扫雷照片:https://www.youtube.com/watch?v=JwcyxuKko_M

但我需要一个MVC模式,我在NullPointer的{​​{1}}行中遇到了stream

View

这是public class View{ Model model; Field f; //here's where I'm trying to access the List created in Field class Stage primarystage; Text number = new Text(); public View(Model model, Stage primaryStage){ this.model = model; this.primarystage = primaryStage; Pane root = new Pane(); root.setPrefSize(model.WIDTH, model.HEIGHT); //iterate through rows and columns to fill board with random bombs for (int y = 0; y < model.Y_FIELDS; y++) { for (int x = 0; x < model.X_FIELDS; x++) { Field field = new Field(x, y, Math.random() < 0.2); model.array[x][y] = field; root.getChildren().add(field); } } for (int y = 0; y < model.Y_FIELDS; y++) { for (int x = 0; x < model.X_FIELDS; x++) { Field field = model.array[x][y]; //trying to access the method getSurrounding from class Field with f long bombs = f.getSurrounding(field).stream().filter(b -> b.isBomb).count(); //number of bombs if (bombs > 0) field.bomb.setText(String.valueOf(bombs)); } } Scene scene = new Scene(root, model.getWidth(), model.getHeight()); getStage().setScene(scene); } 类:

Field

import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.scene.text.Text; import java.util.ArrayList; import java.util.List; public class Field extends StackPane{ //information for each field: x coordinate, y coordinate, is it a bomb or not int x; int y; boolean isBomb; //determines whether or not the field is a bomb int bombsNum = 0; //counts how many bombs are surrounding the field Model model; Rectangle board = new Rectangle(model.FIELD_SIZE - 2, model.FIELD_SIZE - 2); Text bomb = new Text(); public Field(int x, int y, boolean isBomb){ this.x = x; this.y = y; this.isBomb = isBomb; board.setFill(Color.LAVENDER); board.setStroke(Color.BLACK); bomb.setText(isBomb ? "X" : ""); getChildren().addAll(board,bomb); setTranslateX(x * model.FIELD_SIZE); setTranslateY(y * model.FIELD_SIZE); } public List<Field> getSurrounding(Field field){ //looks at all the fields surrounding the current field List<Field> surrounding = new ArrayList<>(); int[] coordinates = new int[]{ -1,-1, //top left field -1, 0, //left field -1, 1, //bottom left field 0,-1, //top middle field 0, 1, //bottom middle field 1,-1, //top right field 1, 0, //right field 1, 1 //bottom right field }; for (int i = 0; i < coordinates.length; i++) { int columnX = coordinates[i]; //considers the x coordinate of a surrounding field int rowY = coordinates[++i]; //considers the y coordinate of a surrounding field int newX = field.x + columnX; //sets the x coordinate of a surrounding field int newY = field.y + rowY; //sets the y coordinate of a surrounding field if (newX >= 0 && newX < model.X_FIELDS //make sure it's not out of bounds && newY >= 0 && newY < model.Y_FIELDS) { surrounding.add(model.array[newX][newY]); } } return surrounding; } } 中的变量:

Model

为什么不工作?我正在尝试将一个列表(包含一个字段的所有邻居)传递到流中并过滤包含炸弹的那些然后计算那些炸弹,以便我可以在当前字段上显示该数字,以便玩家知道。为什么不识别我通过的清单?或者它是混淆的过滤器?谢谢。

public static final int FIELD_SIZE = 40;
public static final int WIDTH = 800;
public static final int HEIGHT = 600;

//sets number of fields in x and y axis
public static final int X_FIELDS = WIDTH / FIELD_SIZE;
public static final int Y_FIELDS = HEIGHT / FIELD_SIZE;

public Field[][] array = new Field[X_FIELDS][Y_FIELDS];

1 个答案:

答案 0 :(得分:0)

我认为getSurrounding()中存在设计问题。目前您需要传递Field作为参数,但据我所知,此参数是无意义。如果您想抓住Field的周围环境,则无需提供另一个Field!只需使用当前的一个(这个)!

public List<Field> getSurrounding() {
    //looks at all the fields surrounding the current field
    List<Field> surrounding = new ArrayList<>();

    int[] coordinates = new int[]{
        -1,-1,  //top left field
        -1, 0,  //left field
        -1, 1,  //bottom left field
         0,-1,  //top middle field
         0, 1,  //bottom middle field
         1,-1,  //top right field
         1, 0,  //right field
         1, 1   //bottom right field
    };

    for (int i = 0; i < coordinates.length; i++) {
        int columnX = coordinates[i];  //considers the x coordinate of a surrounding field
        int rowY = coordinates[++i];   //considers the y coordinate of a surrounding field

        int newX = this.x + columnX;  //sets the x coordinate of a surrounding field
        int newY = this.y + rowY;     //sets the y coordinate of a surrounding field

        if (newX >= 0 && newX < model.X_FIELDS                  
            && newY >= 0 && newY < model.Y_FIELDS) {
            surrounding.add(model.array[newX][newY]);
        }
    }

    return surrounding;
}

此时导致您出现问题的行可以更改为:

long bombs = field.getSurrounding().stream().filter(b -> b.isBomb).count();

这意味着您可以摆脱视图属性Field f,因为它现在尚未使用。这就是为什么它null因为它没有目的,因此从未被初始化的原因。