Fix adjacency count being incorrect due to underlying grid structure in GridWrapper

This commit is contained in:
Tyler 2024-05-27 14:01:16 +01:00
parent 07ab0b898f
commit c72efa8b44
2 changed files with 39 additions and 10 deletions

View File

@ -3,6 +3,7 @@ package com.shr4pnel.minesweeper;
import java.net.URL; import java.net.URL;
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.control.Button;
@ -49,15 +50,29 @@ public class Controller {
private Button createBlankButton() { private Button createBlankButton() {
Image blank = Image blank =
new Image(String.valueOf(getClass().getResource("img/blank.png")), 16, 16, true, true); new Image(String.valueOf(getClass().getResource("img/blank.png")), 16, 16, true, true);
ImageView blankImage = new ImageView(blank); ImageView blankImage = new ImageView(blank);
Button blankButton = new Button(); Button blankButton = new Button();
blankButton.setGraphic(blankImage); blankButton.setGraphic(blankImage);
blankButton.setMinSize(16, 16); blankButton.setMinSize(16, 16);
blankButton.setOnMouseClicked(this::buttonClicked); blankButton.setOnMouseClicked(this::buttonClicked);
blankButton.setOnMousePressed(this::mouseHeld);
blankButton.setOnMouseReleased(this::mouseReleased);
return blankButton; return blankButton;
} }
private void mouseHeld(MouseEvent mouseEvent) {
if (gameOver)
return;
setImage(smiley, "img/face_ooh.png");
}
private void mouseReleased(MouseEvent mouseEvent) {
if (gameOver)
return;
setImage(smiley, "img/face_smile.png");
}
private void buttonClicked(MouseEvent e) { private void buttonClicked(MouseEvent e) {
if (gameOver) { if (gameOver) {
return; return;
@ -81,26 +96,33 @@ public class Controller {
handlePrimaryClick(clicked, column, row); handlePrimaryClick(clicked, column, row);
} }
private void setBombIfFirstTileIsBomb(int column, int row) { private int[] setBombIfFirstTileIsBomb(int column, int row) {
for (int c = 0; c < 30; ++c) { for (int c = 0; c < 30; ++c) {
for (int r = 0; r < 16; ++r) { for (int r = 0; r < 16; ++r) {
if (!wrapper.atColumn(c).atRow(r).isBomb()) { if (!wrapper.atColumn(c).atRow(r).isBomb()) {
wrapper.setBomb(); wrapper.setBomb();
wrapper.updateGrid(column, row, c, r); wrapper.updateGrid(column, row, c, r);
System.out.println("erm"); return new int[]{c, r};
return;
} }
} }
} }
return null;
} }
private void handlePrimaryClick(Button clicked, int column, int row) { private void handlePrimaryClick(Button clicked, int column, int row) {
if (wrapper.atColumn(column).atRow(row).isBomb() && !isFirstClick) { if (wrapper.atColumn(column).atRow(row).isBomb() && !isFirstClick) {
gameOver(clicked); gameOver(clicked);
return; return;
} else if (wrapper.isBomb() && isFirstClick) { }
if (wrapper.isBomb() && isFirstClick) {
int[] chosenColumnAndRow = setBombIfFirstTileIsBomb(column, row);
// assertions are evil but i dont care
assert chosenColumnAndRow != null;
int columnMovedTo = chosenColumnAndRow[0];
int rowMovedTo = chosenColumnAndRow[1];
wrapper.atColumn(column).atRow(row).switchBomb(columnMovedTo, rowMovedTo);
recursiveExpandTiles(column, row);
isFirstClick = false; isFirstClick = false;
setBombIfFirstTileIsBomb(column, row);
} }
int adjacentBombs = wrapper.adjacentBombCount(); int adjacentBombs = wrapper.adjacentBombCount();
setAdjacentCount(clicked, adjacentBombs); setAdjacentCount(clicked, adjacentBombs);
@ -112,7 +134,7 @@ public class Controller {
private void recursiveExpandTiles(int column, int row) { private void recursiveExpandTiles(int column, int row) {
if (column < 0 || column >= 30 || row < 0 || row >= 16 || if (column < 0 || column >= 30 || row < 0 || row >= 16 ||
expandedTiles[column][row] && !wrapper.atColumn(column).atRow(row).isBomb()) { expandedTiles[column][row] && !wrapper.atColumn(column).atRow(row).isBomb()) {
return; return;
} }
expandTile(column, row); expandTile(column, row);
@ -154,6 +176,7 @@ public class Controller {
@FXML @FXML
private void reinitialize() { private void reinitialize() {
gameOver = false;
bombCount = 99; bombCount = 99;
updateBombCounter(); updateBombCounter();
resetTimer(); resetTimer();
@ -195,7 +218,7 @@ public class Controller {
ImageView tileGraphic = (ImageView) tileAsButton.getGraphic(); ImageView tileGraphic = (ImageView) tileAsButton.getGraphic();
Image tileGraphicImage = tileGraphic.getImage(); Image tileGraphicImage = tileGraphic.getImage();
if (!tileGraphicImage.getUrl().contains("blank.png") && if (!tileGraphicImage.getUrl().contains("blank.png") &&
!tileGraphicImage.getUrl().contains("flagged.png")) { !tileGraphicImage.getUrl().contains("flagged.png")) {
return; return;
} }
boolean flagged = tileGraphicImage.getUrl().contains("flagged.png"); boolean flagged = tileGraphicImage.getUrl().contains("flagged.png");
@ -258,7 +281,7 @@ public class Controller {
int column = GridPane.getColumnIndex(node); int column = GridPane.getColumnIndex(node);
int row = GridPane.getRowIndex(node); int row = GridPane.getRowIndex(node);
if (!(column == clickedColumn && row == clickedRow) && if (!(column == clickedColumn && row == clickedRow) &&
wrapper.atColumn(column).atRow(row).isBomb()) { wrapper.atColumn(column).atRow(row).isBomb()) {
setImage((Button) node, "img/bomb_revealed.png"); setImage((Button) node, "img/bomb_revealed.png");
} }
if (buttonURL.contains("flagged.png") && !wrapper.atColumn(column).atRow(row).isBomb()) { if (buttonURL.contains("flagged.png") && !wrapper.atColumn(column).atRow(row).isBomb()) {
@ -284,7 +307,6 @@ public class Controller {
@FXML @FXML
private void smileyReleased() { private void smileyReleased() {
gameOver = false;
setImage(smiley, "img/face_smile.png"); setImage(smiley, "img/face_smile.png");
reinitialize(); reinitialize();
} }

View File

@ -28,6 +28,13 @@ public class GridWrapper {
} }
} }
public void switchBomb(int destinationColumn, int destinationRow) {
if (isValid(currentColumn, currentRow) && isValid(destinationColumn, destinationRow)) {
grid[destinationColumn][destinationRow] = true;
grid[currentColumn][currentRow] = false;
}
}
public boolean isBomb() { public boolean isBomb() {
return isValid(currentColumn, currentRow) && grid[currentColumn][currentRow]; return isValid(currentColumn, currentRow) && grid[currentColumn][currentRow];
} }