Fix adjacency count being incorrect due to underlying grid structure in GridWrapper
This commit is contained in:
parent
07ab0b898f
commit
c72efa8b44
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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];
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user