switch from pre-rendered grid to programmatic

This commit is contained in:
tyler :3 2024-05-17 17:35:30 +01:00
parent d589f40feb
commit f15438363d
2 changed files with 173 additions and 3065 deletions

View File

@ -1,11 +1,11 @@
package com.shr4pnel.minesweeper; package com.shr4pnel.minesweeper;
import java.net.URL; import java.net.URL;
import java.util.ArrayList;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton; import javafx.scene.input.MouseButton;
@ -48,11 +48,49 @@ public class Controller {
@FXML @FXML
private void initialize() { private void initialize() {
for (int column = 0; column < 30; ++column) {
for (int row = 0; row < 16; ++row) {
Image blank =
new Image(String.valueOf(getClass().getResource("img/blank.png")), 16, 16, true,
true);
ImageView blankImage = new ImageView(blank);
Button blankButton = new Button();
blankButton.setGraphic(blankImage);
blankButton.setMinSize(16, 16);
blankButton.setStyle(
"-fx-background-color: transparent; -fx-border-color: transparent; -fx-padding: 0;");
blankButton.setOnMouseClicked(this::buttonClicked);
grid.add(blankButton, column, row);
}
}
gridHandler = new Grid(); gridHandler = new Grid();
wrapper = gridHandler.grid; wrapper = gridHandler.grid;
gridPaneArray = new Node[30][16]; gridPaneArray = new Node[30][16];
for (Node node : grid.getChildren()) { }
gridPaneArray[GridPane.getColumnIndex(node)][GridPane.getRowIndex(node)] = node;
void buttonClicked(MouseEvent e) {
Button clicked = (Button) e.getSource();
int column = GridPane.getColumnIndex(clicked);
int row = GridPane.getRowIndex(clicked);
if (gameOver) {
return;
}
if (isFirstLoad) {
scheduleTimer();
}
isFirstLoad = false;
if (e.getButton() == MouseButton.SECONDARY) {
flag(clicked);
return;
}
if (wrapper.atColumn(column).atRow(row).isBomb()) {
gameOver(clicked);
return;
}
int adjacentBombs = getAdjacentCount(clicked);
setAdjacentCount(clicked);
if (adjacentBombs == 0) {
System.out.println("todo. implement this stupid!");
} }
} }
@ -69,40 +107,15 @@ public class Controller {
timer = new Timer(); timer = new Timer();
URL blank = getClass().getResource("img/blank.png"); URL blank = getClass().getResource("img/blank.png");
for (Node n : grid.getChildren()) { for (Node n : grid.getChildren()) {
ImageView nodeAsImage = (ImageView) n; Button nodeAsButton = (Button) n;
nodeAsImage.setImage(new Image(String.valueOf(blank))); nodeAsButton.setGraphic(new ImageView(new Image(String.valueOf(blank), 16, 16, true, false)));
} }
gridHandler = new Grid(); gridHandler = new Grid();
wrapper = gridHandler.grid; wrapper = gridHandler.grid;
} }
// @FXML
@FXML // private void gridClicked(MouseEvent event) {
private void gridClicked(MouseEvent event) {
if (gameOver) {
return;
}
if (isFirstLoad) {
scheduleTimer();
}
isFirstLoad = false;
Node tileClicked = event.getPickResult().getIntersectedNode();
int column = GridPane.getColumnIndex(tileClicked);
int row = GridPane.getRowIndex(tileClicked);
if (event.getButton() == MouseButton.SECONDARY) {
flag(tileClicked);
return;
}
if (wrapper.atColumn(column).atRow(row).isBomb()) {
gameOver(tileClicked);
return;
}
int adjacentBombs = getAdjacentCount(tileClicked);
setAdjacentCount(tileClicked);
if (adjacentBombs == 0) {
System.out.println("todo. implement this stupid!");
}
}
void gameOver(Node tileClicked) { void gameOver(Node tileClicked) {
gameOver = true; gameOver = true;
@ -110,22 +123,26 @@ public class Controller {
System.out.println("DEAD!!!"); System.out.println("DEAD!!!");
URL smileyURL = getClass().getResource("img/face_dead.png"); URL smileyURL = getClass().getResource("img/face_dead.png");
smiley.setImage(new Image(String.valueOf(smileyURL))); smiley.setImage(new Image(String.valueOf(smileyURL)));
ImageView tileClickedImage = (ImageView) tileClicked; Button tileClickedButton = (Button) tileClicked;
URL deathBombURL = getClass().getResource("img/bomb_death.png"); URL deathBombURL = getClass().getResource("img/bomb_death.png");
tileClickedImage.setImage(new Image(String.valueOf(deathBombURL))); ImageView deathBombImage =
new ImageView(new Image(String.valueOf(deathBombURL), 16, 16, true, false));
tileClickedButton.setGraphic(deathBombImage);
tileClickedButton.setMinSize(16, 16);
tileClickedButton.setPrefSize(16, 16);
showAllBombs(GridPane.getColumnIndex(tileClicked), GridPane.getRowIndex(tileClicked)); showAllBombs(GridPane.getColumnIndex(tileClicked), GridPane.getRowIndex(tileClicked));
} }
void flag(Node tileClicked) { void flag(Node tileClicked) {
bombCount--; bombCount--;
URL flagURL = getClass().getResource("img/bomb_flagged.png"); URL flagURL = getClass().getResource("img/bomb_flagged.png");
Image flagImage = new Image(String.valueOf(flagURL)); Image flagImage = new Image(String.valueOf(flagURL), 16, 16, true, false);
ImageView tile = (ImageView) tileClicked; Button tile = (Button) tileClicked;
if (tile.getImage().equals(flagImage)) { // if (tile.getGraphic().) {
bombCount++; // bombCount++;
} // }
updateBombCounter(); updateBombCounter();
tile.setImage(new Image(String.valueOf(flagURL))); tile.setGraphic(new ImageView(new Image(String.valueOf(flagURL), 16, 16, true, false)));
} }
void updateBombCounter() { void updateBombCounter() {
@ -196,8 +213,10 @@ public class Controller {
continue; continue;
} }
if (wrapper.atColumn(column).atRow(row).isBomb()) { if (wrapper.atColumn(column).atRow(row).isBomb()) {
ImageView imageView = (ImageView) node; Button button = (Button) node;
imageView.setImage(new Image(String.valueOf(bombRevealedURL))); ImageView buttonGraphic =
new ImageView(new Image(String.valueOf(bombRevealedURL), 16, 16, true, false));
button.setGraphic(buttonGraphic);
} }
} }
} }
@ -218,9 +237,13 @@ public class Controller {
void setAdjacentCount(Node tileClicked) { void setAdjacentCount(Node tileClicked) {
int adjacentBombs = getAdjacentCount(tileClicked); int adjacentBombs = getAdjacentCount(tileClicked);
ImageView image = (ImageView) tileClicked; Button button = (Button) tileClicked;
URL imageURL = getClass().getResource("img/num_" + adjacentBombs + ".png"); URL imageURL = getClass().getResource("img/num_" + adjacentBombs + ".png");
image.setImage(new Image(String.valueOf(imageURL))); Button adjacentButton = new Button();
adjacentButton.setMinSize(16, 16);
ImageView buttonImage =
new ImageView(new Image(String.valueOf(imageURL), 16, 16, true, false));
button.setGraphic(buttonImage);
} }
int getAdjacentCount(Node tileClicked) { int getAdjacentCount(Node tileClicked) {

File diff suppressed because it is too large Load Diff