From ef3685172fece2d120218ef25236223334d9ff80 Mon Sep 17 00:00:00 2001 From: vockek Date: Tue, 2 Apr 2024 16:14:21 -0400 Subject: [PATCH 1/3] Fixed "satisfy flag" bug fixed bug where "satisfy flag" allowed you to select an empty tile instead of a flag tile --- .../rpi/legup/puzzle/minesweeper/rules/SatisfyFlagCaseRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/SatisfyFlagCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/SatisfyFlagCaseRule.java index 257cfb41b..e3cd382ed 100644 --- a/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/SatisfyFlagCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/SatisfyFlagCaseRule.java @@ -27,7 +27,7 @@ public CaseBoard getCaseBoard(Board board) { minesweeperBoard.setModifiable(false); for (PuzzleElement data : minesweeperBoard.getPuzzleElements()) { MinesweeperCell cell = (MinesweeperCell) data; - if (cell.getTileNumber() >= 0 && cell.getTileNumber() <= 8 && MinesweeperUtilities.hasEmptyAdjacent(minesweeperBoard, cell)) { + if (cell.getTileNumber() > 0 && cell.getTileNumber() <= 8 && MinesweeperUtilities.hasEmptyAdjacent(minesweeperBoard, cell)) { caseBoard.addPickableElement(data); } } From bbf799b99ac5fb86dce04bbb720beb859e9b9304 Mon Sep 17 00:00:00 2001 From: vockek Date: Tue, 16 Apr 2024 16:50:11 -0400 Subject: [PATCH 2/3] Added "Finish With Bombs" Direct Rule --- .../minesweeper/MinesweeperUtilities.java | 23 ++++++- .../rules/FinishWithBombsDirectRule.java | 62 ++++++++++++++++++ .../LessBombsThanFlagContradictionRule.java | 32 +++++++-- .../images/minesweeper/direct/Fill_Bombs.jpg | Bin 0 -> 22643 bytes 4 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/FinishWithBombsDirectRule.java create mode 100644 src/main/resources/edu/rpi/legup/images/minesweeper/direct/Fill_Bombs.jpg diff --git a/src/main/java/edu/rpi/legup/puzzle/minesweeper/MinesweeperUtilities.java b/src/main/java/edu/rpi/legup/puzzle/minesweeper/MinesweeperUtilities.java index e74979e19..f54a1d825 100644 --- a/src/main/java/edu/rpi/legup/puzzle/minesweeper/MinesweeperUtilities.java +++ b/src/main/java/edu/rpi/legup/puzzle/minesweeper/MinesweeperUtilities.java @@ -1,5 +1,11 @@ package edu.rpi.legup.puzzle.minesweeper; +import edu.rpi.legup.puzzle.fillapix.FillapixBoard; +import edu.rpi.legup.puzzle.fillapix.FillapixCell; +import edu.rpi.legup.puzzle.fillapix.FillapixCellType; +import edu.rpi.legup.puzzle.fillapix.rules.TooFewBlackCellsContradictionRule; +import edu.rpi.legup.puzzle.minesweeper.rules.LessBombsThanFlagContradictionRule; + import java.awt.*; import java.util.Objects; import java.util.stream.IntStream; @@ -95,7 +101,7 @@ public static ArrayList getAdjacentCells(MinesweeperBoard board continue; } MinesweeperCell adjCell = (MinesweeperCell) board.getCell(cellLoc.x + i, cellLoc.y + j); - if (adjCell == null) { + if (adjCell == null || adjCell == cell) { continue; } adjCells.add(adjCell); @@ -137,5 +143,20 @@ private static void recurseCombinations(ArrayList result, int curInde recurseCombinations(result, curIndex+1, maxBlack, numBlack, len, workingArray); } + public static boolean isForcedBomb(MinesweeperBoard board, MinesweeperCell cell) { + + LessBombsThanFlagContradictionRule tooManyBombs = + new LessBombsThanFlagContradictionRule(); + MinesweeperBoard emptyCaseBoard = board.copy(); + MinesweeperCell emptyCell = (MinesweeperCell) emptyCaseBoard.getPuzzleElement(cell); + emptyCell.setCellType(MinesweeperTileData.empty()); + ArrayList adjCells = getAdjacentCells(emptyCaseBoard, emptyCell); + for (MinesweeperCell adjCell : adjCells) { + if (tooManyBombs.checkContradictionAt(emptyCaseBoard, adjCell) == null) { + return true; + } + } + return false; + } } diff --git a/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/FinishWithBombsDirectRule.java b/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/FinishWithBombsDirectRule.java new file mode 100644 index 000000000..67bbe6a33 --- /dev/null +++ b/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/FinishWithBombsDirectRule.java @@ -0,0 +1,62 @@ +package edu.rpi.legup.puzzle.minesweeper.rules; + +import edu.rpi.legup.model.gameboard.Board; +import edu.rpi.legup.model.gameboard.PuzzleElement; +import edu.rpi.legup.model.rules.DirectRule; +import edu.rpi.legup.model.tree.TreeNode; +import edu.rpi.legup.model.tree.TreeTransition; +import edu.rpi.legup.puzzle.minesweeper.*; + +public class FinishWithBombsDirectRule extends DirectRule { + public FinishWithBombsDirectRule() { + super( + "Finish with Bombs", + "The remaining unknowns around a flag must be bombs to satisfy the number", + "edu/rpi/legup/images/minesweeper/direct/Fill_Bombs.jpg"); + } + + @Override + public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElement) { + MinesweeperBoard board = (MinesweeperBoard) transition.getBoard(); + MinesweeperBoard parentBoard = (MinesweeperBoard) transition.getParents().get(0).getBoard(); + MinesweeperCell cell = (MinesweeperCell) board.getPuzzleElement(puzzleElement); + MinesweeperCell parentCell = (MinesweeperCell) parentBoard.getPuzzleElement(puzzleElement); + + if (!(parentCell.getTileType() == MinesweeperTileType.UNSET + && cell.getTileType() == MinesweeperTileType.BOMB)) { + return super.getInvalidUseOfRuleMessage() + + ": This cell must be black to be applicable with this rule."; + } + + if (MinesweeperUtilities.isForcedBomb(parentBoard, cell)) { + return null; + } else { + return super.getInvalidUseOfRuleMessage() + ": This cell is not forced to be black"; + } + } + + /** + * Creates a transition {@link Board} that has this rule applied to it using the {@link + * TreeNode}. + * + * @param node tree node used to create default transition board + * @return default board or null if this rule cannot be applied to this tree node + */ + @Override + public Board getDefaultBoard(TreeNode node) { + MinesweeperBoard minesweeperBoard = (MinesweeperBoard) node.getBoard().copy(); + for (PuzzleElement element : minesweeperBoard.getPuzzleElements()) { + MinesweeperCell cell = (MinesweeperCell) element; + if (cell.getTileType() == MinesweeperTileType.UNSET + && MinesweeperUtilities.isForcedBomb((MinesweeperBoard) node.getBoard(), cell)) { + cell.setCellType(MinesweeperTileData.bomb()); + minesweeperBoard.addModifiedData(cell); + } + } + if (minesweeperBoard.getModifiedData().isEmpty()) { + return null; + } else { + return minesweeperBoard; + } + } +} diff --git a/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/LessBombsThanFlagContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/LessBombsThanFlagContradictionRule.java index 0cc1f6324..5d809d527 100644 --- a/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/LessBombsThanFlagContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/LessBombsThanFlagContradictionRule.java @@ -3,12 +3,10 @@ import edu.rpi.legup.model.gameboard.Board; import edu.rpi.legup.model.gameboard.PuzzleElement; import edu.rpi.legup.model.rules.ContradictionRule; -import edu.rpi.legup.puzzle.nurikabe.NurikabeBoard; -import edu.rpi.legup.puzzle.nurikabe.NurikabeCell; -import edu.rpi.legup.puzzle.nurikabe.NurikabeType; -import edu.rpi.legup.puzzle.nurikabe.NurikabeUtilities; +import edu.rpi.legup.puzzle.minesweeper.*; import edu.rpi.legup.utility.DisjointSets; +import java.util.ArrayList; import java.util.Set; public class LessBombsThanFlagContradictionRule extends ContradictionRule { @@ -23,8 +21,30 @@ public LessBombsThanFlagContradictionRule() { @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - - return null; + MinesweeperBoard minesweeperBoard = (MinesweeperBoard) board; + MinesweeperCell cell = (MinesweeperCell) minesweeperBoard.getPuzzleElement(puzzleElement); + + int cellNum = cell.getTileNumber(); + if (cellNum <= 0 || cellNum >= 9) { + return super.getNoContradictionMessage(); + } + int numEmpty = 0; + int numAdj = 0; + ArrayList adjCells = MinesweeperUtilities.getAdjacentCells(minesweeperBoard, cell); + for (MinesweeperCell adjCell : adjCells) { + numAdj++; + if (adjCell.getTileType() == MinesweeperTileType.EMPTY && adjCell != cell) { + numEmpty++; + } + } + System.out.println(numEmpty); + System.out.println(numAdj); + System.out.println(cellNum); + if (numEmpty > (numAdj-cellNum)) { + return null; + } + + return super.getNoContradictionMessage(); } diff --git a/src/main/resources/edu/rpi/legup/images/minesweeper/direct/Fill_Bombs.jpg b/src/main/resources/edu/rpi/legup/images/minesweeper/direct/Fill_Bombs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8214972ac8bf278e441e719ad9ef32c3feae346e GIT binary patch literal 22643 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 qKNsOIqW7=B3F9s2eTRO!tr)YnHh$2ag@yf literal 0 HcmV?d00001 From 8c653d8fb80c406d6bd9cd03f438a7e2f80f1a90 Mon Sep 17 00:00:00 2001 From: vockek Date: Tue, 16 Apr 2024 16:52:42 -0400 Subject: [PATCH 3/3] Update FinishWithBombsDirectRule.java --- .../puzzle/minesweeper/rules/FinishWithBombsDirectRule.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/FinishWithBombsDirectRule.java b/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/FinishWithBombsDirectRule.java index 67bbe6a33..9f5c4279c 100644 --- a/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/FinishWithBombsDirectRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/minesweeper/rules/FinishWithBombsDirectRule.java @@ -10,6 +10,7 @@ public class FinishWithBombsDirectRule extends DirectRule { public FinishWithBombsDirectRule() { super( + "MINE-BASC-0001", "Finish with Bombs", "The remaining unknowns around a flag must be bombs to satisfy the number", "edu/rpi/legup/images/minesweeper/direct/Fill_Bombs.jpg");