我正在制作扫雷照片: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];
答案 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
因为它没有目的,因此从未被初始化的原因。