diff --git a/src/main/MazeMain.java b/src/main/MazeMain.java index 941a797..ee0b28e 100644 --- a/src/main/MazeMain.java +++ b/src/main/MazeMain.java @@ -1,6 +1,8 @@ import net.curtlewis.maze.algorithm.BinaryTree; import net.curtlewis.maze.algorithm.Sidewinder; +import net.curtlewis.maze.distance.Distances; import net.curtlewis.maze.grid.Cell; +import net.curtlewis.maze.grid.DistanceGrid; import net.curtlewis.maze.grid.Grid; public class MazeMain { @@ -8,10 +10,17 @@ public static void main(String[] args) throws Exception { Cell cell = new Cell(1, 2); - Grid grid = new Grid(10, 10); + // Grid grid = new Grid(10, 10); // BinaryTree maze = new BinaryTree(grid); + DistanceGrid grid = new DistanceGrid(10, 10); Sidewinder maze = new Sidewinder(grid); + Cell root = grid.getCellAt(0, 4); + grid.setDistances(root.calculateDistances()); + grid.hideDistanceValues(); System.out.println(maze.toString()); + grid.showDistanceValues(); + System.out.println("=========================================\n"); + System.out.println(grid); } } diff --git a/src/main/net/curtlewis/maze/distance/Distances.java b/src/main/net/curtlewis/maze/distance/Distances.java new file mode 100644 index 0000000..95eadd7 --- /dev/null +++ b/src/main/net/curtlewis/maze/distance/Distances.java @@ -0,0 +1,41 @@ +package net.curtlewis.maze.distance; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import net.curtlewis.maze.grid.Cell; + +public class Distances { + + private Cell root; + private Map cells; + + public Distances(Cell root) { + this.root = root; + cells = new HashMap<>(); + cells.put(root, 0); + } + + // public int distanceFrom(Cell cell) { + // if (cells.containsKey(cell)) { + // return cells.get(cell); + // } else { + // return -1; + // } + // } + + public void setDistanceTo(Cell cell, int dist) { + cells.put(cell, dist); + } + + public Set getCells() { + return cells.keySet(); + } + + public int getDistance(Cell cell) { + return cells.containsKey(cell) ? cells.get(cell) : 0; + } + + +} diff --git a/src/main/net/curtlewis/maze/grid/Cell.java b/src/main/net/curtlewis/maze/grid/Cell.java index 05044cf..e8cfc74 100644 --- a/src/main/net/curtlewis/maze/grid/Cell.java +++ b/src/main/net/curtlewis/maze/grid/Cell.java @@ -1,6 +1,9 @@ package net.curtlewis.maze.grid; import java.util.Map; + +import net.curtlewis.maze.distance.Distances; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -16,6 +19,8 @@ private Cell east; private Cell west; + private Distances distances; + public Cell(int row, int col) { this.row = row; this.col = col; @@ -96,4 +101,31 @@ public String toString() { return "Cell[row: " + row + " col: " + col + "]"; } + + public Distances getDistances() { + return distances; + } + + public Distances calculateDistances() { + + distances = new Distances(this); + List frontier = new ArrayList<>(); + frontier.add(this); + + while(frontier.size() > 0) { + List newFrontier = new ArrayList<>(); + + frontier.forEach(cell -> { + cell.getLinks().forEach(linked -> { + if (!distances.getCells().contains(linked)) { + distances.setDistanceTo(linked, distances.getDistance(cell) + 1); + newFrontier.add(linked); + } + }); + }); + + frontier = newFrontier; + } + return distances; + } } diff --git a/src/main/net/curtlewis/maze/grid/DistanceGrid.java b/src/main/net/curtlewis/maze/grid/DistanceGrid.java new file mode 100644 index 0000000..efaf6ba --- /dev/null +++ b/src/main/net/curtlewis/maze/grid/DistanceGrid.java @@ -0,0 +1,38 @@ +package net.curtlewis.maze.grid; + +import net.curtlewis.maze.distance.Distances; + +public class DistanceGrid extends Grid { + + private Distances distances; + private boolean showDistanceValue; + + public DistanceGrid(int rows, int columns) { + super(rows, columns); + showDistanceValue = true; + } + + public void setDistances(Distances distances) { + this.distances = distances; + } + + public Distances getDistances() { + return distances; + } + + // public boolean getShowDistanceValue() { return showDistanceValue; } + // public void setShowDistanceValue(boolean val) { showDistanceValue = val; } + + public void showDistanceValues() { showDistanceValue = true; } + public void hideDistanceValues() { showDistanceValue = false; } + + public String contentsOf(Cell cell) { + + if (showDistanceValue && distances != null && distances.getCells().contains(cell)) { + return Integer.toString(distances.getDistance(cell), 36); + } else { + return super.contentsOf(cell); + } + } + +} diff --git a/src/main/net/curtlewis/maze/grid/Grid.java b/src/main/net/curtlewis/maze/grid/Grid.java index 878977a..35b1167 100644 --- a/src/main/net/curtlewis/maze/grid/Grid.java +++ b/src/main/net/curtlewis/maze/grid/Grid.java @@ -85,6 +85,10 @@ return columns; } + public String contentsOf(Cell cell) { + return " "; + } + public String toString() { StringBuilder sb = new StringBuilder(); @@ -106,7 +110,8 @@ Cell sell = getCellAt(r, c); Cell cell = sell != null ? sell : new Cell(-1, -1); - String body = " "; // <-- 3 spaces + // String body = " "; // <-- 3 spaces + String body = " " + contentsOf(cell) + " "; // <-- 3 spaces String eastBoundary = cell.hasLink(cell.getEast()) ? " " : "|"; top = top + body + eastBoundary;