I was entrusted with the task of creating a maze in Java. Here's the task:
Write an application that finds a path through a maze. The maze should be read from a file. A sample maze is shown below. OOOOOXO XXOXOOX OXOOXXX XXXOOXO XXXXOOX OOOOOOO XXOXXXO
The βXβ represents a wall or a blocked position, and the βOβ represents an open position. You can assume that the entrance to the maze is always in the lower right hand and the exit is always in the upper left corner. Your program should send the output to a file. If a path is found, the output file must contain the path. If the path is not found, the message should be sent to the file. Note that a maze can have more than one solution path, but in this exercise you will be asked to find one solution, not all solutions.
Your program should use the stack to write the path that it is exploring, and back off when it reaches a locked position.
Be sure to write a complete algorithm before writing code. Feel free to create any additional classes that will help you complete the task.
Here my Algorithm: 1)Initialize array list to hold maze 2)Read text file holding maze in format oxxxxo ooxoxx ooooox xxxxoo 3)Create variables to hold numbers of columns and rows 3)While text file has next line A. Read next line B. Tokenize line C. Create a temporary ArrayList D. While there are tokens i. Get token ii. create a Point iii. add point to temp ArrayList iv. increment maximum number of columns E. Add temp to maze arraylist, increment max rows F. initialize a hold of points as max rows - 1 G. Create a start point with x values as maximum number of rows - 1, and y values as maximum number of columns - 1 H. Create stack of points and push starting location I. While finished searching is not done i. Look at top of stack and check for finish ii. check neighbors iii. is there an open neighbor? - if yes, update flags and push - if no, pop from stack J. Print solution 4. Done is true
Anyway, what I created is the Points class, which has set / get methods for moving in all the main directions that return boolean values, as shown:
public class Points<E> { private int xCoord; private int yCoord; private char val; private boolean N; private boolean S; private boolean E; private boolean W; public Points() { xCoord =0; yCoord =0; val =' '; N = true; S = true; E = true; W = true; } public Points (int X, int Y) { xCoord = X; yCoord = Y; } public void setX(int x) { xCoord = x; } public void setY(int y) { yCoordinate = y; } public void setNorth(boolean n) { N = n; } public void setSouth(boolean s) { S= s; } public void setEast(boolean e) { E = e; } public void setWest(boolean w) { W = w; } public int getX() { return xCoord; } public int getY() { return yCoord; } public char getVal() { return val; } public boolean getNorth() { return N; } public boolean getSouth() { return S; } public boolean getEast() { return E; } public boolean getWest() { return W; } public String toString1() { String result = "(" + xCoord + ", " +yCoord + ")"; return result; }
}
I just have problems with the actual solution basically. Here is what I have:
import java.io.*; import java.util.*; import java.lang.*; import java.text.*; public class MazeSolve1 { public static void main(String[] args) { //Create arrayList of Points ArrayList<ArrayList<Points>> MAZE = new ArrayList<ArrayList<Points>>(); Scanner in = new Scanner(System.in); //Read File in System.out.print("Enter the file name: "); String fileName = in.nextLine(); fileName = fileName.trim(); FileReader reader = new FileReader(fileName+".txt"); Scanner in2 = new Scanner(reader); //Write file out FileWriter writer = new FileWriter("Numbers.out"); PrintWriter out = new PrintWriter(writer); boolean done = false; int maxCol = 0; int maxRow = 0; while(!done) { //creating array lists while (in2.hasNextLine()) { //Read next line String nextLine = in2.nextLine(); //Tokenize Line StringTokenizer st = new StringTokenizer(nextLine, " "); //Create temp ArrayList ArrayList<ArrayList<Points>> temp = new ArrayList<ArrayList<Points>>(); //While there are more tokens while (st.hasNextToken()) { String token = st.nextToken(); Points pt = new Points(); temp.add(pt); maxCol++ } MAZE.add(temp); maxRow++; } //create hold arraylist for max rows of maze -1 //create variables for start x and y coordinates ArrayList<ArrayList<Points>> hold = new ArrayList<ArrayList<Points>>(); hold = MAZE.get(maxRow - 1); int startColumn = hold.get(maxCol - 1); int startRow = hold.get(maxRow - 1); Point start = new Point(); start.setX(startColumn); start.setY(startRow); //initialize stack, and push the start position MyStack<Points> st = new ArrayStack<Points>(); st.push(start.toString1()); //south and east of start are edges of array start.setSouth(false); start.setEast(false); //while your position is not equal to point (0,0) [finish] while (st.peek() != "(0, 0)") { //getting the next coordinate to the North int nextY = start.getY() - 1; int nextX = start.getX(); //if character to the North is an O it open and the North flag is true if (hold.get(nextY) = 'O' && start.getNorth() == true) { //set flags and push coordinate start.setNorth(false); st.push(start.toString1()); } //else pop from stack else { st.pop(); } //look at coordinate to the East nextX = start.getX() + 1; //if character to the East is a O and the East flag is true if (hold.get(nextX) = 'O' && start.getEast() == true) { //set flags and push coordinate start.setEast(false); st.push(start.toString1()); } //else pop from stack else { st.pop(); } //look at coordinate to the South nextY = start.getY() + 1; //if character to the South is a O and the West flag is true if (hold.get(nextY) = 'O' && start.getSouth() == true) { //set flags and push coordinate start.setSouth(false); st.push(start.toString1()); } //else pop from stack else { st.pop() } //keep looping until the top of the stack reads (0, 0) } done = true; } //Print the results System.out.println("---Path taken---"); for (int i = 0; i< st.size(); i++) { System.out.println(st.pop); i++ }
Besides any syntax errors, could you guys help me out? Many thanks.