public static void drawHorizontalWalls(CellData[][] map, int row) { String str = "X"; for (int i = 0; i < 4; i++) { CellData currentCell = map[i][row]; if (currentCell == null) { if (i == 3) { str = str + "NNNX"; } else { str = str + "NNNN"; } } else { if (currentCell.getNorthWall()) { str = str + "XXXX"; } else { if (i == 3) { str = str + "...X"; } else { str = str + "..."; if (currentCell.getEastWall()) { str = str + "X"; } else { str = str + "."; } } } } } System.out.println(str); }
public static void drawMapCells(CellData[][] map, int row) { for (int i = 0; i < 3; i++) { String str = "X"; for (int j = 0; j < 4; j++) { CellData currentCell = map[j][row]; if (currentCell == null) { if (j != 3) { str = str + "NNNN"; } else { str = str + "NNNX"; } } else { str = str + "..."; if (j == 3) { str = str + "X"; } else { if (currentCell.getEastWall()) { str = str + "X"; } else { str = str + "."; } } } } System.out.println(str); } }
/** * Looks at the surrounding cells based on the current one to determine which ways have been tried * already and sets the appropriate boolean values in the current cell * * @param currentCell -- this is the cell in the maze the robot is currently in * @param map -- this is the array that stores the cell data of all explored cells in the maze */ public static void analyzeSurroundings(CellData currentCell, CellData[][] map) { int x = currentCell.getX(); int y = currentCell.getY(); // look at the cell to the North try { CellData north = map[x][y + 1]; if (north == null) { } else { currentCell.setTriedNorth(true); } } catch (IndexOutOfBoundsException e) { // exception thrown if at the edge of the maze currentCell.setTriedNorth(true); } // look at the cell to the East try { CellData east = map[x + 1][y]; if (east == null) { } else { currentCell.setTriedEast(true); } } catch (IndexOutOfBoundsException e) { // exception thrown if at the edge of the maze currentCell.setTriedEast(true); } // look at the cell to the South try { CellData south = map[x][y - 1]; if (south == null) { } else { currentCell.setTriedSouth(true); } } catch (IndexOutOfBoundsException e) { // exception thrown if at the edge of the maze currentCell.setTriedSouth(true); } // look at the cell to the West try { CellData west = map[x - 1][y]; if (west == null) { } else { currentCell.setTriedWest(true); } } catch (IndexOutOfBoundsException e) { // exception thrown if at the edge of the maze currentCell.setTriedWest(true); } }
public static void goHome(SimRobot simRobot, int angle, LinkedList<CellData> moveHistory) { System.out.println("E.T. phone home..."); CellData destination = moveHistory.getLast(); CellData currentCell = moveHistory.pop(); CellData nextMove = moveHistory.peek(); while ((currentCell.getX() != destination.getX()) || (currentCell.getY() != destination.getY())) { System.out.println( "The current cell is (" + currentCell.getX() + ", " + currentCell.getY() + ")"); System.out.println( "The next cell should be (" + nextMove.getX() + ", " + nextMove.getY() + ")"); if ((currentCell.getX() - nextMove.getX() == 0) && (currentCell.getY() - nextMove.getY() == 0)) { System.out.println("There was a duplicate"); currentCell = moveHistory.pop(); } else if (currentCell.getX() - nextMove.getX() == 0) { // if the x values are the same then move either north or south System.out.println("Move North or South"); if (currentCell.getY() - nextMove.getY() == 1) { // then go south System.out.println("Go South"); if (angle % 360 == 0) { simRobot.right90(); simRobot.right90(); } else if (angle % 360 == 90) { simRobot.right90(); } else if (angle % 360 == 270) { simRobot.left90(); } simRobot.forwardOneCell(); // reset the angle to south angle = 180; currentCell = moveHistory.pop(); } else { // then go North System.out.println("Go North"); if (angle % 360 == 90) { simRobot.left90(); } else if (angle % 360 == 180) { simRobot.left90(); simRobot.left90(); } else if (angle % 360 == 270) { simRobot.right90(); } simRobot.forwardOneCell(); // reset the angle to North angle = 0; currentCell = moveHistory.pop(); } } else if (currentCell.getY() - nextMove.getY() == 0) { System.out.println("Move East or West"); if (currentCell.getX() - nextMove.getX() == 1) { // go west System.out.println("Go West"); if (angle % 360 == 0) { simRobot.left90(); } else if (angle % 360 == 90) { simRobot.right90(); simRobot.right90(); } else if (angle % 360 == 180) { simRobot.right90(); } simRobot.forwardOneCell(); // reset the angle to North angle = 270; currentCell = moveHistory.pop(); } else { // go East System.out.println("Go East"); if (angle % 360 == 0) { simRobot.right90(); } else if (angle % 360 == 180) { simRobot.left90(); } else if (angle % 360 == 270) { simRobot.right90(); simRobot.right90(); } simRobot.forwardOneCell(); // reset the angle to North angle = 90; currentCell = moveHistory.pop(); } } nextMove = moveHistory.peek(); } System.out.println("E.T. made it back successfully!"); }
public static void findClosestMove( SimRobot simRobot, int angle, LinkedList<CellData> moveHistory, LinkedList<CellData> notFullyExplored) { CellData destination = notFullyExplored.pop(); CellData currentCell = moveHistory.pop(); CellData nextMove = moveHistory.peek(); // while the robot is still making its way back to the closest open move while ((currentCell.getX() != destination.getX()) || (currentCell.getY() != destination.getY())) { if (currentCell.getX() - nextMove.getX() == 0) { // if the x values are the same then move either north or south if (currentCell.getY() - nextMove.getY() == 1) { moveSouth(simRobot, angle); angle = 180; currentCell = moveHistory.pop(); } else if (currentCell.getY() - nextMove.getY() == -1) { moveNorth(simRobot, angle); angle = 0; currentCell = moveHistory.pop(); } } else { if (currentCell.getX() - nextMove.getX() == 1) { moveWest(simRobot, angle); angle = 270; currentCell = moveHistory.pop(); } else if (currentCell.getX() - nextMove.getX() == -1) { moveEast(simRobot, angle); angle = 90; currentCell = moveHistory.pop(); } } nextMove = moveHistory.peek(); } // orient robot north after arrived at desired cell if (angle == 90) { simRobot.left90(); } else if (angle == 180) { simRobot.left90(); simRobot.left90(); } else if (angle == 270) { simRobot.right90(); } }