Я делаю версию Game of Life, но у меня возникают проблемы с удалением цвета фона ячеек, которые должны умирать.
Код (извлечение):
public class Life extends Application {
private static int DIM = 32;
private Cell[][] cell = new Cell[DIM][DIM];
private boolean[][] nextState = new boolean[DIM][DIM];
private Timeline animation = new Timeline(new KeyFrame(Duration.millis(300), e -> step()));
private RadioButton rbLife = new RadioButton("Life");
private RadioButton rbHLife = new RadioButton("HighLife");
private Button step = new Button("Step");
private Button playStop = new Button("Play");
private Button clear = new Button("Clear");
private Slider slRate = new Slider();
private Label rate = new Label("Rate: ");
@Override
public void start(Stage primaryStage) {
GridPane pane = new GridPane();
pane.setStyle("-fx-background-color: black");
for (int i = 0; i < DIM; i++)
for (int j = 0; j < DIM; j++)
pane.add(cell[i][j] = new Cell(), j, i);
BorderPane borderPane = new BorderPane();
borderPane.setCenter(pane);
borderPane.setBottom(getHBox());
public void step() {
for (int i=0; i < DIM; i++) {
for (int j = 0; j < DIM; j++) {
computeNextState(i, j);
}
}
for (int i=0; i < DIM; i++) {
for (int j = 0; j < DIM; j++) {
cell[i][j].updateState(nextState[i][j], i, j);
}
}
}
public boolean[][] computeNextState(int row, int col) {
int liveCount = 0;
for (int i = -1; i <= 1; i++)
for (int j = -1; j <= 1; j++)
if (cell[(row + i + DIM) % DIM][(col + j + DIM) % DIM].isAlive())
liveCount++;
if (cell[row][col].isAlive())
liveCount--;
if (rbLife.isSelected()) {
if (liveCount == 3 || cell[row][col].isAlive() && liveCount == 2) {
nextState[row][col] = true;
}
else
nextState[row][col] = false;
}
return nextState;
}
public class Cell extends Pane {
private char token = ' ';
public Cell() {
setStyle("-fx-border-color: white; -fx-border-width: .17;");
this.setPrefSize(100, 100);
this.setOnMouseClicked(e -> handleMouseClick());
}
public boolean isAlive() {
if (token == 'a') {
return true;
}
else
return false;
}
public char getToken() {
return token;
}
public void setToken(char c) {
token = c;
}
private void handleMouseClick() {
setStyle("-fx-background-color: green");
setToken('a');
}
public void updateState(boolean state, int row, int col) {
if (state == true) {
setToken('a');
setStyle("-fx-background-color: green");
}
else
setToken(' ');
//cell[row][col].setBackground(Background.EMPTY);
}
}
В updateState () я попытался установить черный, нулевой фон, очистить стиль с помощью getStyleClass (). Clear().
Установка фона на пустой с помощью setBackground () перекрасит их в черный цвет, но тогда ячейки не могут быть перекрашены в зеленый цвет в следующем поколении.Что я здесь упускаю?
Я пропустил части, которые, я думаю, не имеют значения.Спасибо за любые СОВЕТЫ!