From 12d14dcd006decd238d816623412a57d2ad62d85 Mon Sep 17 00:00:00 2001 From: popem Date: Wed, 13 Jul 2022 21:10:16 -0400 Subject: [PATCH 1/6] small edits to exceeding/less visibility contradiction rule --- .../ExceedingVisibilityContradictionRule.java | 7 +- ...sufficientVisibilityContradictionRule.java | 95 ++++++++++--------- 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index af9a035df..9b59530f2 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -72,7 +72,7 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); - count = count + 1; + count++; } } if (count > east) { @@ -91,10 +91,11 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); - count = count + 1; + count++; } if (c.getType() == SkyscrapersType.UNKNOWN) { complete = false; + break; } } if (count > north && complete) { @@ -111,7 +112,7 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); - count = count + 1; + count++; } } if (count > south) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 45418916f..84a270f97 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -29,17 +29,20 @@ public InsufficientVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + //why is this run for every cell? SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); + - Set candidates = new HashSet(); - - //check row + //get borders int west = skyscrapersboard.getRow().get(loc.y).getData(); int east = skyscrapersboard.getRowClues().get(loc.y).getData(); int north = skyscrapersboard.getCol().get(loc.x).getData(); int south = skyscrapersboard.getColClues().get(loc.x).getData(); + + //check row + //from west border int max = 0; int count = 0; boolean complete = true; @@ -53,32 +56,34 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } if (c.getType() == SkyscrapersType.UNKNOWN) { complete = false; + break; } } - if (count < west && complete == true) { - return null; - } - - max = 0; - count = 0; - complete = true; - for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count = count + 1; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - } - } - if (count < east && complete == true) { + if (count < west && complete) { return null; } + + if(complete){ + //from east border + max = 0; + count = 0; + for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { + SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); + if (c.getType() == SkyscrapersType.Number && c.getData() > max) { + //System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count < east) { + return null; + } + } + - // check column + //check column + //from north border max = 0; count = 0; complete = true; @@ -88,34 +93,34 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); - count = count + 1; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - } - } - if (count < north && complete == true) { - return null; - } - - max = 0; - count = 0; - complete = true; - for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count = count + 1; + count++; } if (c.getType() == SkyscrapersType.UNKNOWN) { complete = false; + break; } } - if (count < south && complete == true) { + if (count < north && complete) { return null; } + + if(complete){ + //from south border + max = 0; + count = 0; + for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { + SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); + if (c.getType() == SkyscrapersType.Number && c.getData() > max) { + //System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count < south) { + return null; + } + } //System.out.print("Does not contain a contradiction at this index"); return super.getNoContradictionMessage(); From 79cf5e76046cc06a57ceac1e019bdb281ecd43cc Mon Sep 17 00:00:00 2001 From: popem Date: Wed, 13 Jul 2022 22:46:55 -0400 Subject: [PATCH 2/6] exceeding/less visibility contradiction rule now utilize getRowCol, a previously unused board function --- .../ExceedingVisibilityContradictionRule.java | 92 ++++++++--------- ...sufficientVisibilityContradictionRule.java | 99 +++++++++---------- 2 files changed, 89 insertions(+), 102 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index 9b59530f2..2b7ffd3f3 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -8,7 +8,9 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.*; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; public class ExceedingVisibilityContradictionRule extends ContradictionRule { @@ -41,35 +43,30 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { int south = skyscrapersboard.getColClues().get(loc.x).getData(); //check row - //from west border int max = 0; int count = 0; - boolean complete = true; - for (int i = 0; i < skyscrapersboard.getWidth(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count++; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - break; - } - } - if (count > west && complete) { - return null; - } + List row = skyscrapersboard.getRowCol(loc.y,SkyscrapersType.Number,true); + if(row.size()==skyscrapersboard.getWidth()){ + //from west border + for(SkyscrapersCell c : row){ + if (c.getData() > max) { + System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count > west) { + return null; + } - if(complete) { - //from east border max = 0; count = 0; - for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); + //from east border + Collections.reverse(row); + for(SkyscrapersCell c : row){ + if (c.getData() > max) { + System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); count++; @@ -81,35 +78,32 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } //check column - //from north border - max = 0; - count = 0; - complete = true; - for (int i = 0; i < skyscrapersboard.getHeight(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count++; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - break; - } - } - if (count > north && complete) { - return null; - } + List col = skyscrapersboard.getRowCol(loc.x,SkyscrapersType.Number,false); + if(col.size()==skyscrapersboard.getHeight()){ + //from north border + max = 0; + count = 0; + for(SkyscrapersCell c : col){ + System.out.println(c.getData()); + if (c.getData() > max) { + + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count > north) { + return null; + } - if(complete) { //from south border max = 0; count = 0; - for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); + Collections.reverse(col); + for(SkyscrapersCell c : col){ + System.out.println(c.getData()); + if (c.getData() > max) { + //System.out.println(cell.getData()); max = c.getData(); count++; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 84a270f97..90fd471d2 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -8,7 +8,9 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.*; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; public class InsufficientVisibilityContradictionRule extends ContradictionRule { @@ -42,35 +44,30 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { int south = skyscrapersboard.getColClues().get(loc.x).getData(); //check row - //from west border - int max = 0; - int count = 0; - boolean complete = true; - for (int i = 0; i < skyscrapersboard.getWidth(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count++; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - break; - } - } - if (count < west && complete) { - return null; - } + int max = 0; + int count = 0; + java.util.List row = skyscrapersboard.getRowCol(loc.y,SkyscrapersType.Number,true); + if(row.size()==skyscrapersboard.getWidth()){ + //from west border + for(SkyscrapersCell c : row){ + if (c.getData() > max) { + System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count < west) { + return null; + } - if(complete){ - //from east border max = 0; count = 0; - for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); + //from east border + Collections.reverse(row); + for(SkyscrapersCell c : row){ + if (c.getData() > max) { + System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); count++; @@ -81,37 +78,33 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } } - - //check column - //from north border - max = 0; - count = 0; - complete = true; - for (int i = 0; i < skyscrapersboard.getHeight(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count++; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - break; - } - } - if (count < north && complete) { - return null; - } + //check column + List col = skyscrapersboard.getRowCol(loc.x,SkyscrapersType.Number,false); + if(col.size()==skyscrapersboard.getHeight()){ + //from north border + max = 0; + count = 0; + for(SkyscrapersCell c : col){ + System.out.println(c.getData()); + if (c.getData() > max) { + + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count < north) { + return null; + } - if(complete){ //from south border max = 0; count = 0; - for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); + Collections.reverse(col); + for(SkyscrapersCell c : col){ + System.out.println(c.getData()); + if (c.getData() > max) { + //System.out.println(cell.getData()); max = c.getData(); count++; From 5277de2bc7bdc245ac7fe995174e89f8e09ae5fc Mon Sep 17 00:00:00 2001 From: popem Date: Wed, 13 Jul 2022 23:46:30 -0400 Subject: [PATCH 3/6] added CellForNumber, no implementation --- .../rules/CellForNumberCaseRule.java | 42 ++++++++++++++++++ .../skyscrapers/cases/CellForNumber.png | Bin 0 -> 67322 bytes 2 files changed, 42 insertions(+) create mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java new file mode 100644 index 000000000..c4417701d --- /dev/null +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -0,0 +1,42 @@ +package edu.rpi.legup.puzzle.skyscrapers.rules; + +import edu.rpi.legup.model.gameboard.Board; +import edu.rpi.legup.model.gameboard.CaseBoard; +import edu.rpi.legup.model.gameboard.PuzzleElement; +import edu.rpi.legup.model.rules.CaseRule; +import edu.rpi.legup.model.tree.TreeTransition; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersLine; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; + +import java.util.List; + +public class CellForNumberCaseRule extends CaseRule { + //select a certain row/col? select a certain number? + public CellForNumberCaseRule() { + super("SKYS-CASE-0002", "Cell For Number", + "Each blank cell is could have height of 1 to n.", + "edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png"); + } + + @Override + public CaseBoard getCaseBoard(Board board) { + return null; + } + + @Override + public List getCases(Board board, PuzzleElement puzzleElement) { + return null; + } + + @Override + public String checkRuleRaw(TreeTransition transition) { + return null; + } + + @Override + public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElement) { + return null; + } +} diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png new file mode 100644 index 0000000000000000000000000000000000000000..7eaee5d06bb81e453b84ba30a3a29b969203935e GIT binary patch literal 67322 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
  • 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 E4_Nys#sB~S literal 0 HcmV?d00001 From 2fbce01b2717525d87da973b8c323f92372d0022 Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 4 Aug 2022 11:39:40 -0400 Subject: [PATCH 4/6] filled CaseBoard for cell4number, commented other places --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 8 ++++++++ .../rules/CellForNumberCaseRule.java | 18 +++++++++++++----- .../ExceedingVisibilityContradictionRule.java | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index b4de925e3..97b5455b7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -163,6 +163,14 @@ public List getDiagonals(SkyscrapersCell cell, SkyscrapersType return dia; } + /** + * Gets the cells of a certain type in a given row/column + * + * @param index: y pos of row or x pos of col, + * type of cell to collect, + * boolean true if row, false if col + * @return list of cells of the given type, ordered west to east or north to south + */ public List getRowCol(int index, SkyscrapersType type, boolean isRow) { List list = new ArrayList<>(); if (isRow) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index c4417701d..9059ca4aa 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -5,10 +5,7 @@ import edu.rpi.legup.model.gameboard.PuzzleElement; import edu.rpi.legup.model.rules.CaseRule; import edu.rpi.legup.model.tree.TreeTransition; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersLine; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; +import edu.rpi.legup.puzzle.skyscrapers.*; import java.util.List; @@ -22,7 +19,18 @@ public CellForNumberCaseRule() { @Override public CaseBoard getCaseBoard(Board board) { - return null; + SkyscrapersBoard currentBoard = (SkyscrapersBoard) board.copy(); + currentBoard.setModifiable(false); + CaseBoard caseBoard = new CaseBoard(currentBoard, this); + for (SkyscrapersClue data : currentBoard.getRow()) { + System.out.println(data.getType()); + caseBoard.addPickableElement(data); + } + for (SkyscrapersClue data : currentBoard.getCol()) { + System.out.println(data.getType()); + caseBoard.addPickableElement(data); + } + return caseBoard; } @Override diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index 2b7ffd3f3..662e8d590 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -31,7 +31,7 @@ public ExceedingVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //why is this called for every cell? + //why is this called for every cell? maybe:override checkcontradiction SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); From 5c14e85ac5e0505df9ce29902b1cfecd8dfe661c Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 4 Aug 2022 14:54:10 -0400 Subject: [PATCH 5/6] basic edits, began unresolvedNumber --- .../rules/CellForNumberCaseRule.java | 2 +- .../skyscrapers/rules/FixedMaxBasicRule.java | 19 +++---- ...sufficientVisibilityContradictionRule.java | 2 +- .../rules/LastNumberBasicRule.java | 30 +++++------ .../skyscrapers/rules/OneEdgeBasicRule.java | 7 ++- .../rules/PossibleContentsCaseRule.java | 2 +- .../UnresolvedNumberContradictionRule.java | 48 ++++++++++++++++++ .../contradictions/UnresolvedNumber.png | Bin 0 -> 2413 bytes 8 files changed, 79 insertions(+), 31 deletions(-) create mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index 9059ca4aa..30aec7ffb 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -13,7 +13,7 @@ public class CellForNumberCaseRule extends CaseRule { //select a certain row/col? select a certain number? public CellForNumberCaseRule() { super("SKYS-CASE-0002", "Cell For Number", - "Each blank cell is could have height of 1 to n.", + "A number (1-n) must appear in any given row/column", "edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png"); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java index ac04d9816..1dbccdce1 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java @@ -37,8 +37,8 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem SkyscrapersCell initCell = (SkyscrapersCell) initialBoard.getPuzzleElement(puzzleElement); SkyscrapersBoard finalBoard = (SkyscrapersBoard) transition.getBoard(); SkyscrapersCell finalCell = (SkyscrapersCell) finalBoard.getPuzzleElement(puzzleElement); - if (!(initCell.getType() == SkyscrapersType.UNKNOWN && finalCell.getType() == SkyscrapersType.Number)) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be number"; + if (initCell.getType() != SkyscrapersType.UNKNOWN || finalCell.getType() != SkyscrapersType.Number) { + return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } SkyscrapersBoard emptyCase = initialBoard.copy(); @@ -91,20 +91,21 @@ private boolean isForced(SkyscrapersBoard board, SkyscrapersCell cell) { @Override public Board getDefaultBoard(TreeNode node) { SkyscrapersBoard initialBoard = (SkyscrapersBoard) node.getBoard(); - SkyscrapersBoard lightUpBoard = (SkyscrapersBoard) node.getBoard().copy(); - System.out.println(lightUpBoard.getPuzzleElements().size()); - for (PuzzleElement element : lightUpBoard.getPuzzleElements()) { - System.out.println("123"); + SkyscrapersBoard modBoard = (SkyscrapersBoard) node.getBoard().copy(); + System.out.println(modBoard.getPuzzleElements().size()); + for (PuzzleElement element : modBoard.getPuzzleElements()) { + System.out.println("123"); SkyscrapersCell cell = (SkyscrapersCell) element; if (cell.getType() == SkyscrapersType.UNKNOWN && isForced(initialBoard, cell)) { //cell.setData(SkyscrapersType.BULB.value); - lightUpBoard.addModifiedData(cell); + modBoard.addModifiedData(cell); } } - if (lightUpBoard.getModifiedData().isEmpty()) { + System.out.println(modBoard.getModifiedData().isEmpty()); + if (modBoard.getModifiedData().isEmpty()) { return null; } else { - return lightUpBoard; + return modBoard; } } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 90fd471d2..73cd120bb 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -31,7 +31,7 @@ public InsufficientVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //why is this run for every cell? + //why is this run for every cell? maybe:override checkcontradiction to every row/col SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java index 231287ff6..ffed421e4 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java @@ -18,7 +18,7 @@ public class LastNumberBasicRule extends BasicRule { public LastNumberBasicRule() { super("SKYS-BASC-0003", "Last Number", - "A certain cell must contain a certain number since that number is the only one that can possibly appear in that cell.", + "A certain cell must contain a certain number since that number is the only one that does not create a duplicate contradiction.", "edu/rpi/legup/images/skyscrapers/rules/LastNumber.png"); } @@ -37,39 +37,39 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem SkyscrapersCell initCell = (SkyscrapersCell) initialBoard.getPuzzleElement(puzzleElement); SkyscrapersBoard finalBoard = (SkyscrapersBoard) transition.getBoard(); SkyscrapersCell finalCell = (SkyscrapersCell) finalBoard.getPuzzleElement(puzzleElement); - if (!(initCell.getType() == SkyscrapersType.UNKNOWN && finalCell.getType() == SkyscrapersType.Number)) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be number"; + if (initCell.getType() != SkyscrapersType.UNKNOWN || finalCell.getType() != SkyscrapersType.Number) { + return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } SkyscrapersBoard emptyCase = initialBoard.copy(); emptyCase.getPuzzleElement(finalCell).setData(0); Point loc = finalCell.getLocation(); - + + //init with all possible numbers Set candidates = new HashSet(); for (int i = 1; i <= initialBoard.getWidth(); i++) { candidates.add(i); } - //check row + //remove any existing numbers for (int i = 0; i < initialBoard.getWidth(); i++) { + //check row SkyscrapersCell c = initialBoard.getCell(i, loc.y); if (i != loc.x && c.getType() == SkyscrapersType.Number) { candidates.remove(c.getData()); //System.out.print(c.getData()); //System.out.println(finalCell.getData()); } - } - - // check column - for (int i = 0; i < initialBoard.getHeight(); i++) { - SkyscrapersCell c = initialBoard.getCell(loc.x, i); - if (i != loc.y && c.getType() == SkyscrapersType.Number) { - candidates.remove(c.getData()); - //System.out.print(c.getData()); - //System.out.println(finalCell.getData()); + // check column + c = initialBoard.getCell(loc.x, i); + if (i != loc.y && c.getType() == SkyscrapersType.Number) { + candidates.remove(c.getData()); + //System.out.print(c.getData()); + //System.out.println(finalCell.getData()); } } - + + //check if given value is the only remaining value DuplicateNumberContradictionRule duplicate = new DuplicateNumberContradictionRule(); if (candidates.size() == 1 && duplicate.checkContradictionAt(emptyCase, finalCell) != null) { Iterator it = candidates.iterator(); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java index f5a8d5841..f78516913 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java @@ -37,8 +37,8 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem SkyscrapersCell initCell = (SkyscrapersCell) initialBoard.getPuzzleElement(puzzleElement); SkyscrapersBoard finalBoard = (SkyscrapersBoard) transition.getBoard(); SkyscrapersCell finalCell = (SkyscrapersCell) finalBoard.getPuzzleElement(puzzleElement); - if (!(initCell.getType() == SkyscrapersType.UNKNOWN && finalCell.getType() == SkyscrapersType.Number)) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be number"; + if (initCell.getType() != SkyscrapersType.UNKNOWN || finalCell.getType() != SkyscrapersType.Number) { + return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } SkyscrapersBoard emptyCase = initialBoard.copy(); @@ -65,9 +65,8 @@ else if (loc.y == 0 && initialBoard.getCol().get(loc.x).getData() == 1) { else if (loc.y == initialBoard.getHeight() - 1 && initialBoard.getColClues().get(loc.x).getData() == 1) { return null; } else { - return "This cell is not forced."; + return "This cell is not forced."; } - } private boolean isForced(SkyscrapersBoard board, SkyscrapersCell cell) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java index 41f07a906..d1f340429 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java @@ -18,7 +18,7 @@ public class PossibleContentsCaseRule extends CaseRule { public PossibleContentsCaseRule() { super("SKYS-CASE-0001", "Possible Contents", - "Each blank cell is could have height of 1 to n.", + "A blank cell must have height of 1 to n.", "edu/rpi/legup/images/skyscrapers/cases/PossibleContents.png"); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java new file mode 100644 index 000000000..e99e5c16e --- /dev/null +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java @@ -0,0 +1,48 @@ +package edu.rpi.legup.puzzle.skyscrapers.rules; + + +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.skyscrapers.SkyscrapersBoard; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; + +import java.awt.*; +import java.util.HashSet; +import java.util.Set; + +public class UnresolvedNumberContradictionRule extends ContradictionRule { + + public UnresolvedNumberContradictionRule() { + super("SKYS-CONT-0005", "Unresolved Cell", + "No possible cell for a number without a duplicate contradiction.", + //specify a number? defaulting to every number for now. expand to more than duplicate? + "edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png"); + } + + /** + * Checks whether the transition has a contradiction at the specific puzzleElement index using this rule + * + * @param board board to check contradiction + * @param puzzleElement equivalent puzzleElement + * @return null if the transition contains a contradiction at the specified puzzleElement, + * otherwise error message + */ + @Override + public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + //maybe: override check contradiction to only rows/cols for each number + SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; + SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; + Point loc = cell.getLocation(); + + //each possible value + for (int i = 0; i < skyscrapersboard.getWidth(); i++) { + + } + + + return super.getNoContradictionMessage(); + } +} + diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 From 93a9e82056a0cb68326ccf6df926e82cbf0874fe Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 4 Aug 2022 15:14:46 -0400 Subject: [PATCH 6/6] checkContradiction overrides --- .../DuplicateNumberContradictionRule.java | 1 + .../ExceedingVisibilityContradictionRule.java | 22 ++++++++++++++++++- ...sufficientVisibilityContradictionRule.java | 21 ++++++++++++++++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java index 9bfab10fe..aacad9059 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java @@ -29,6 +29,7 @@ public DuplicateNumberContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + //TODO:? Refactor to count each row/col once rather than per cell (override checkContradiction) SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index 662e8d590..5d0ca049e 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -31,7 +31,6 @@ public ExceedingVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //why is this called for every cell? maybe:override checkcontradiction SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); @@ -117,4 +116,25 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print("Does not contain a contradiction at this index"); return super.getNoContradictionMessage(); } + + /** + * Checks whether the tree node has a contradiction using this rule + * + * @param board board to check contradiction + * @return null if the tree node contains a contradiction, otherwise error message + */ + @Override + public String checkContradiction(Board board) { + SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; + for (int i = 0; i < skyscrapersBoard.getWidth(); i++) { + //checks the middle diagonal (checkContradictionAt checks row/col off each) + String checkStr = checkContradictionAt(board, skyscrapersBoard.getCell(i,i)); + if (checkStr == null) { + return checkStr; + } + } + return "No instance of the contradiction " + this.ruleName + " here"; + } + } + diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 73cd120bb..7d8b2eb2b 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -31,12 +31,10 @@ public InsufficientVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //why is this run for every cell? maybe:override checkcontradiction to every row/col SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); - //get borders int west = skyscrapersboard.getRow().get(loc.y).getData(); int east = skyscrapersboard.getRowClues().get(loc.y).getData(); @@ -118,4 +116,23 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print("Does not contain a contradiction at this index"); return super.getNoContradictionMessage(); } + + /** + * Checks whether the tree node has a contradiction using this rule + * + * @param board board to check contradiction + * @return null if the tree node contains a contradiction, otherwise error message + */ + @Override + public String checkContradiction(Board board) { + SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; + for (int i = 0; i < skyscrapersBoard.getWidth(); i++) { + //checks the middle diagonal (checkContradictionAt checks row/col off each) + String checkStr = checkContradictionAt(board, skyscrapersBoard.getCell(i,i)); + if (checkStr == null) { + return checkStr; + } + } + return "No instance of the contradiction " + this.ruleName + " here"; + } }