need help with code I wrote This code is a maze gui and i ne
need help with code I wrote. This code is a maze gui, and i need help with the method shorterstpath(); here is my code:
******mazeApp*******
package mazepackage;
import javafx.application.Application;
 import javafx.application.Platform;
 import javafx.scene.Group;
 import javafx.scene.Scene;
 import javafx.scene.canvas.Canvas;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.control.TextInputDialog;
 import javafx.scene.paint.Color;
 import javafx.stage.Stage;
public class MazeApp extends Application
 {
 // default canvas size is DEFAULT_SIZE-by-DEFAULT_SIZE
 private static final int DEFAULT_SIZE = 768;
 private int width = DEFAULT_SIZE;
 private int height = DEFAULT_SIZE;
 // The graphics context is needed to enable drawing on the canvas
 private GraphicsContext gc;
 // boundary of drawing canvas, 0% border
 // private static final double BORDER = 0.05;
 private static final double BORDER = 0.00;
 private double xmin, ymin, xmax, ymax;
public static void main(String[] args)
 {
 launch(args);
 }
@Override
 public void start(Stage primaryStage)
 {
 Group root = new Group();
 Canvas canvas = new Canvas(width, height);
 gc = canvas.getGraphicsContext2D();
 gc.setLineWidth(2);
 gc.setFill(Color.WHITE);
 gc.fillRect(0, 0, width, height);
 root.getChildren().add(canvas);
   
 TextInputDialog tid = new TextInputDialog();
 tid.setTitle(\"Maze Size\");
 tid.setHeaderText(\"Enter maze size between 10 and 50\");
 tid.showAndWait();
 int size = Integer.parseInt(tid.getResult());
 if (size > 50)
 size = 50;
 if (size < 10)
 size = 10;
   
 primaryStage.setTitle(\"Maze Application\");
 primaryStage.setScene(new Scene(root));
 primaryStage.setResizable(false);
 // Make sure that the application goes away when then window is closed
 primaryStage.setOnCloseRequest(e -> System.exit(0));
 primaryStage.show();
   
 Maze maze = new Maze(this, size);
 // Must solve the maze in a separate thread or else
 // the GUI wont update until the end.....
 Thread solver = new Thread(
 new Runnable () {
 public void run()
 {
 while(true)
 {
 maze.buildAndDrawMaze();
 maze.findShortestPath();
 try
 {
 Thread.sleep(5000);
 }
 catch(Exception e) { }
 gc.setFill(Color.WHITE);
 gc.fillRect(0, 0, width, height);
 }
 }
 });
 solver.start();
 }
/**
 * Sets the pen color to the specified color.
 *
 * @param color the color to make the pen
 */
 public void setPenColor(Color color) {
 gc.setStroke(color);
 }
   
 /**
 * Sets the pen color to the specified color.
 *
 * @param color the color to make the pen
 */
 public void setFillColor(Color color) {
 gc.setFill(color);
 }
 /**
 * Sets the <em>x</em>-scale to the specified range.
 *
 * @param min the minimum value of the <em>x</em>-scale
 * @param max the maximum value of the <em>x</em>-scale
 * @throws IllegalArgumentException if {@code (max == min)}
 */
 public void setXscale(double min, double max) {
 double size = max - min;
 if (size == 0.0) {
 throw new IllegalArgumentException(\"the min and max are the same\");
 }
xmin = min - BORDER * size;
 xmax = max + BORDER * size;
 }
/**
 * Sets the <em>y</em>-scale to the specified range.
 *
 * @param min the minimum value of the <em>y</em>-scale
 * @param max the maximum value of the <em>y</em>-scale
 * @throws IllegalArgumentException if {@code (max == min)}
 */
 public void setYscale(double min, double max) {
 double size = max - min;
 if (size == 0.0) {
 throw new IllegalArgumentException(\"the min and max are the same\");
 }
ymin = min - BORDER * size;
 ymax = max + BORDER * size;
 }
// helper functions that scale from user coordinates to screen coordinates and back
 private double scaleX(double x) {
 return width * (x - xmin) / (xmax - xmin);
 }
private double scaleY(double y) {
 return height * (ymax - y) / (ymax - ymin);
 }
private double factorX(double w) {
 return w * width / Math.abs(xmax - xmin);
 }
private double factorY(double h) {
 return h * height / Math.abs(ymax - ymin);
 }
private double userX(double x) {
 return xmin + x * (xmax - xmin) / width;
 }
private double userY(double y) {
 return ymax - y * (ymax - ymin) / height;
 }
/**
 * Draws a line segment between (<em>x</em><sub>0</sub>,
 * <em>y</em><sub>0</sub>) and (<em>x</em><sub>1</sub>,
 * <em>y</em><sub>1</sub>).
 *
 * @param x0 the <em>x</em>-coordinate of one endpoint
 * @param y0 the <em>y</em>-coordinate of one endpoint
 * @param x1 the <em>x</em>-coordinate of the other endpoint
 * @param y1 the <em>y</em>-coordinate of the other endpoint
 */
 public void line(double x0, double y0, double x1, double y1) {
 gc.strokeLine(scaleX(x0), scaleY(y0), scaleX(x1), scaleY(y1));
 }
/**
 * Draws one pixel at (<em>x</em>, <em>y</em>). This method is private
 * because pixels depend on the display. To achieve the same effect, set the
 * pen radius to 0 and call {@code point()}.
 *
 * @param x the <em>x</em>-coordinate of the pixel
 * @param y the <em>y</em>-coordinate of the pixel
 */
 private void pixel(double x, double y) {
 gc.fillRect((int) Math.round(scaleX(x)), (int) Math.round(scaleY(y)), 1, 1);
 }
/**
 * Draws a filled circle of the specified radius, centered at (<em>x</em>,
 * <em>y</em>).
 *
 * @param x the <em>x</em>-coordinate of the center of the circle
 * @param y the <em>y</em>-coordinate of the center of the circle
 * @param radius the radius of the circle
 * @throws IllegalArgumentException if {@code radius} is negative
 */
 public void filledCircle(double x, double y, double radius) {
 double xs = scaleX(x);
 double ys = scaleY(y);
 double ws = factorX(2 * radius);
 double hs = factorY(2 * radius);
 if (ws <= 1 && hs <= 1) {
 pixel(x, y);
 } else {
 gc.fillOval(xs - ws / 2, ys - hs / 2, ws, hs);
 }
 }
 }
***********maze.java**************
package mazepackage;
import java.util.LinkedList;
 import java.util.Random;
 import javafx.scene.paint.Color;
public class Maze {
private int N; // dimension of maze
 private MazeCell[][] maze;
 private Random rand = new Random();
 // Used to signal the maze has been solved
 private boolean done;
 // time in milliseconds (from currentTimeMillis()) when we can draw again
 // used to control the frame rate
 private long nextDraw = -1;
 private MazeApp mf;
 // Define constants for the circle size
 private final double BIG = 0.375;
 private final double SMALL = 0.25;
 // Define constants for the delay times
 private final int SHORT = 30;
 private final int LONG = 500;
public Maze(MazeApp ma, int n) {
 N = n;
 mf = ma;
 mf.setXscale(0, N + 2);
 mf.setYscale(0, N + 2);
 }
public void buildAndDrawMaze() {
 createMaze();
 buildMaze();
 drawMaze();
 }
// create the initial data structures that contain the maze data
 private void createMaze() {
 maze = new MazeCell[N + 2][N + 2];
 for (int i = 0; i < N + 2; i++) {
 for (int j = 0; j < N + 2; j++) {
 maze[i][j] = new MazeCell(i, j);
 }
 }
 // initialize border cells as already visited
 for (int x = 0; x < N + 2; x++) {
 maze[x][0].visited = true;
 maze[x][N + 1].visited = true;
 }
 for (int y = 0; y < N + 2; y++) {
 maze[0][y].visited = true;
 maze[N + 1][y].visited = true;
 }
 }
// build the maze
 private void buildMaze(int x, int y) {
 maze[x][y].visited = true;
 // while there is an unvisited neighbor
 while (!maze[x][y + 1].visited || !maze[x + 1][y].visited
 || !maze[x][y - 1].visited || !maze[x - 1][y].visited) {
 // pick random neighbor (could use Knuth\'s trick instead)
 while (true) {
 int r = rand.nextInt(4);
 if (r == 0 && !maze[x][y + 1].visited) {
 maze[x][y].nth = false;
 maze[x][y + 1].sth = false;
 buildMaze(x, y + 1);
 break;
 } else if (r == 1 && !maze[x + 1][y].visited) {
 maze[x][y].est = false;
 maze[x + 1][y].wst = false;
 buildMaze(x + 1, y);
 break;
 } else if (r == 2 && !maze[x][y - 1].visited) {
 maze[x][y].sth = false;
 maze[x][y - 1].nth = false;
 buildMaze(x, y - 1);
 break;
 } else if (r == 3 && !maze[x - 1][y].visited) {
 maze[x][y].wst = false;
 maze[x - 1][y].est = false;
 buildMaze(x - 1, y);
 break;
 }
 }
 }
 }
// build the maze starting from lower left
 private void buildMaze() {
 buildMaze(1, 1);
 // Make sure visited is reset to false
 for (int x = 1; x < N + 1; x++) {
 for (int y = 1; y < N + 1; y++) {
 maze[x][y].visited = false;
 }
 }
 // delete some random walls
 for (int i = 0; i < N; i++) {
 int x = 1 + rand.nextInt(N - 1);
 int y = 1 + rand.nextInt(N - 1);
 maze[x][y].nth = maze[x][y + 1].sth = false;
 }
 }
// draw the initial maze
 private void drawMaze() {
 drawCircle(Color.RED, N / 2, N / 2, BIG);
 drawCircle(Color.RED, 1, 1, BIG);
 // Draw the walls in black
 mf.setPenColor(Color.BLACK);
 for (int x = 1; x <= N; x++) {
 for (int y = 1; y <= N; y++) {
 if (maze[x][y].sth) {
 mf.line(x, y, x + 1, y);
 }
 if (maze[x][y].nth) {
 mf.line(x, y + 1, x + 1, y + 1);
 }
 if (maze[x][y].wst) {
 mf.line(x, y, x, y + 1);
 }
 if (maze[x][y].est) {
 mf.line(x + 1, y, x + 1, y + 1);
 }
 }
 }
 delay(LONG);
 }
private void delay(int t) {
 // sleep until the next time we\'re allowed to draw
 long millis = System.currentTimeMillis();
 if (millis < nextDraw) {
 try {
 Thread.sleep(nextDraw - millis);
 } catch (InterruptedException e) {
 System.out.println(\"Error sleeping\");
 }
 millis = nextDraw;
 }
 // when are we allowed to draw again
 nextDraw = millis + t;
 }
private void drawCircle(Color c, double x, double y, double size) {
 mf.setFillColor(c);
 mf.filledCircle(x + 0.5, y + 0.5, size);
 }
   
 public void findShortestPath() {
 // Your code goes here!!!!!
 }
 }
class MazeCell {
 // nth, sth, est, wst used to identify walls - true indicates wall present
 boolean nth, sth, wst, est;
 // used to indicate that a cell has already been processed
 boolean visited;
 // used to facilitate finding the neighbors of a cell
 int row, col;
public MazeCell(int i, int j) {
 row = i;
 col = j;
 // All walls are initially present for every cell
 nth = sth = est = wst = true;
 // Initially no cells have been visited
 visited = false;
 }
 }
class MazeMap {
 MazeCell nFromCenter = null;
 MazeMap nMinus1FromCenter = null;
 }
***end of code***
here is the stradgey that Im supposed to follow:
Strategy:
Implement the findShortestPath() method in the given code to find the shortest solution in the maze.
Strategy will be using breadth first search starting from the end point of the maze looking for the entrance.
Create two linked list of MazeMap objects
LinkedList<MazeMap>
Create MazeMap for center and add to first list(Center MazeCell is maze[N/2][N/2], entrance is maze[1][1])
Iterate through first list and add MazeMap distance n+1 to second list.
Set first list equal to second list, clear second list and repeat.
MazeCell:
In the GUI representation, rows of the maze are vertical, columns are horizontal. Cell 0,0 of the maze in drawn in the lower left corner. The following summarizes what to do to move in a specific direction from any cell in the maze. Remember, each cell contains its own row, col position.
North neighbor is at row, col + 1
South neighbor is at row, col – 1
East neighbor is at row + 1, col
West neighbor is at row – 1, col
Solution
import javafx.application.Application;
 import javafx.application.Platform;
 import javafx.scene.Group;
 import javafx.scene.Scene;
 import javafx.scene.canvas.Canvas;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.control.TextInputDialog;
 import javafx.scene.paint.Color;
 import javafx.stage.Stage;
public class MazeApp extends Application
 {
 // default canvas size is DEFAULT_SIZE-by-DEFAULT_SIZE
 private static final int DEFAULT_SIZE = 768;
 private int width = DEFAULT_SIZE;
 private int height = DEFAULT_SIZE;
 // The graphics context is needed to enable drawing on the canvas
 private GraphicsContext gc;
 // boundary of drawing canvas, 0% border
 // private static final double BORDER = 0.05;
 private static final double BORDER = 0.00;
 private double xmin, ymin, xmax, ymax;
public static void main(String[] args)
 {
 launch(args);
 }
@Override
 public void start(Stage primaryStage)
 {
 Group root = new Group();
 Canvas canvas = new Canvas(width, height);
 gc = canvas.getGraphicsContext2D();
 gc.setLineWidth(2);
 gc.setFill(Color.WHITE);
 gc.fillRect(0, 0, width, height);
 root.getChildren().add(canvas);
   
 TextInputDialog tid = new TextInputDialog();
 tid.setTitle(\"Maze Size\");
 tid.setHeaderText(\"Enter maze size between 10 and 50\");
 tid.showAndWait();
 int size = Integer.parseInt(tid.getResult());
 if (size > 50)
 size = 50;
 if (size < 10)
 size = 10;
   
 primaryStage.setTitle(\"Maze Application\");
 primaryStage.setScene(new Scene(root));
 primaryStage.setResizable(false);
 // Make sure that the application goes away when then window is closed
 primaryStage.setOnCloseRequest(e -> System.exit(0));
 primaryStage.show();
   
 Maze maze = new Maze(this, size);
 // Must solve the maze in a separate thread or else
 // the GUI wont update until the end.....
 Thread solver = new Thread(
 new Runnable () {
 public void run()
 {
 while(true)
 {
 maze.buildAndDrawMaze();
 maze.findShortestPath();
 try
 {
 Thread.sleep(5000);
 }
 catch(Exception e) { }
 gc.setFill(Color.WHITE);
 gc.fillRect(0, 0, width, height);
 }
 }
 });
 solver.start();
 }
/**
 * Sets the pen color to the specified color.
 *
 * @param color the color to make the pen
 */
 public void setPenColor(Color color) {
 gc.setStroke(color);
 }
   
 /**
 * Sets the pen color to the specified color.
 *
 * @param color the color to make the pen
 */
 public void setFillColor(Color color) {
 gc.setFill(color);
 }
 /**
 * Sets the <em>x</em>-scale to the specified range.
 *
 * @param min the minimum value of the <em>x</em>-scale
 * @param max the maximum value of the <em>x</em>-scale
 * @throws IllegalArgumentException if {@code (max == min)}
 */
 public void setXscale(double min, double max) {
 double size = max - min;
 if (size == 0.0) {
 throw new IllegalArgumentException(\"the min and max are the same\");
 }
xmin = min - BORDER * size;
 xmax = max + BORDER * size;
 }
/**
 * Sets the <em>y</em>-scale to the specified range.
 *
 * @param min the minimum value of the <em>y</em>-scale
 * @param max the maximum value of the <em>y</em>-scale
 * @throws IllegalArgumentException if {@code (max == min)}
 */
 public void setYscale(double min, double max) {
 double size = max - min;
 if (size == 0.0) {
 throw new IllegalArgumentException(\"the min and max are the same\");
 }
ymin = min - BORDER * size;
 ymax = max + BORDER * size;
 }
// helper functions that scale from user coordinates to screen coordinates and back
 private double scaleX(double x) {
 return width * (x - xmin) / (xmax - xmin);
 }
private double scaleY(double y) {
 return height * (ymax - y) / (ymax - ymin);
 }
private double factorX(double w) {
 return w * width / Math.abs(xmax - xmin);
 }
private double factorY(double h) {
 return h * height / Math.abs(ymax - ymin);
 }
private double userX(double x) {
 return xmin + x * (xmax - xmin) / width;
 }
private double userY(double y) {
 return ymax - y * (ymax - ymin) / height;
 }
/**
 * Draws a line segment between (<em>x</em><sub>0</sub>,
 * <em>y</em><sub>0</sub>) and (<em>x</em><sub>1</sub>,
 * <em>y</em><sub>1</sub>).
 *
 * @param x0 the <em>x</em>-coordinate of one endpoint
 * @param y0 the <em>y</em>-coordinate of one endpoint
 * @param x1 the <em>x</em>-coordinate of the other endpoint
 * @param y1 the <em>y</em>-coordinate of the other endpoint
 */
 public void line(double x0, double y0, double x1, double y1) {
 gc.strokeLine(scaleX(x0), scaleY(y0), scaleX(x1), scaleY(y1));
 }
/**
 * Draws one pixel at (<em>x</em>, <em>y</em>). This method is private
 * because pixels depend on the display. To achieve the same effect, set the
 * pen radius to 0 and call {@code point()}.
 *
 * @param x the <em>x</em>-coordinate of the pixel
 * @param y the <em>y</em>-coordinate of the pixel
 */
 private void pixel(double x, double y) {
 gc.fillRect((int) Math.round(scaleX(x)), (int) Math.round(scaleY(y)), 1, 1);
 }
/**
 * Draws a filled circle of the specified radius, centered at (<em>x</em>,
 * <em>y</em>).
 *
 * @param x the <em>x</em>-coordinate of the center of the circle
 * @param y the <em>y</em>-coordinate of the center of the circle
 * @param radius the radius of the circle
 * @throws IllegalArgumentException if {@code radius} is negative
 */
 public void filledCircle(double x, double y, double radius) {
 double xs = scaleX(x);
 double ys = scaleY(y);
 double ws = factorX(2 * radius);
 double hs = factorY(2 * radius);
 if (ws <= 1 && hs <= 1) {
 pixel(x, y);
 } else {
 gc.fillOval(xs - ws / 2, ys - hs / 2, ws, hs);
 }
 }
 }
***********maze.java**************
package mazepackage;
import java.util.LinkedList;
 import java.util.Random;
 import javafx.scene.paint.Color;
public class Maze {
private int N; // dimension of maze
 private MazeCell[][] maze;
 private Random rand = new Random();
 // Used to signal the maze has been solved
 private boolean done;
 // time in milliseconds (from currentTimeMillis()) when we can draw again
 // used to control the frame rate
 private long nextDraw = -1;
 private MazeApp mf;
 // Define constants for the circle size
 private final double BIG = 0.375;
 private final double SMALL = 0.25;
 // Define constants for the delay times
 private final int SHORT = 30;
 private final int LONG = 500;
public Maze(MazeApp ma, int n) {
 N = n;
 mf = ma;
 mf.setXscale(0, N + 2);
 mf.setYscale(0, N + 2);
 }
public void buildAndDrawMaze() {
 createMaze();
 buildMaze();
 drawMaze();
 }
// create the initial data structures that contain the maze data
 private void createMaze() {
 maze = new MazeCell[N + 2][N + 2];
 for (int i = 0; i < N + 2; i++) {
 for (int j = 0; j < N + 2; j++) {
 maze[i][j] = new MazeCell(i, j);
 }
 }
 // initialize border cells as already visited
 for (int x = 0; x < N + 2; x++) {
 maze[x][0].visited = true;
 maze[x][N + 1].visited = true;
 }
 for (int y = 0; y < N + 2; y++) {
 maze[0][y].visited = true;
 maze[N + 1][y].visited = true;
 }
 }
// build the maze
 private void buildMaze(int x, int y) {
 maze[x][y].visited = true;
 // while there is an unvisited neighbor
 while (!maze[x][y + 1].visited || !maze[x + 1][y].visited
 || !maze[x][y - 1].visited || !maze[x - 1][y].visited) {
 // pick random neighbor (could use Knuth\'s trick instead)
 while (true) {
 int r = rand.nextInt(4);
 if (r == 0 && !maze[x][y + 1].visited) {
 maze[x][y].nth = false;
 maze[x][y + 1].sth = false;
 buildMaze(x, y + 1);
 break;
 } else if (r == 1 && !maze[x + 1][y].visited) {
 maze[x][y].est = false;
 maze[x + 1][y].wst = false;
 buildMaze(x + 1, y);
 break;
 } else if (r == 2 && !maze[x][y - 1].visited) {
 maze[x][y].sth = false;
 maze[x][y - 1].nth = false;
 buildMaze(x, y - 1);
 break;
 } else if (r == 3 && !maze[x - 1][y].visited) {
 maze[x][y].wst = false;
 maze[x - 1][y].est = false;
 buildMaze(x - 1, y);
 break;
 }
 }
 }
 }
// build the maze starting from lower left
 private void buildMaze() {
 buildMaze(1, 1);
 // Make sure visited is reset to false
 for (int x = 1; x < N + 1; x++) {
 for (int y = 1; y < N + 1; y++) {
 maze[x][y].visited = false;
 }
 }
 // delete some random walls
 for (int i = 0; i < N; i++) {
 int x = 1 + rand.nextInt(N - 1);
 int y = 1 + rand.nextInt(N - 1);
 maze[x][y].nth = maze[x][y + 1].sth = false;
 }
 }
// draw the initial maze
 private void drawMaze() {
 drawCircle(Color.RED, N / 2, N / 2, BIG);
 drawCircle(Color.RED, 1, 1, BIG);
 // Draw the walls in black
 mf.setPenColor(Color.BLACK);
 for (int x = 1; x <= N; x++) {
 for (int y = 1; y <= N; y++) {
 if (maze[x][y].sth) {
 mf.line(x, y, x + 1, y);
 }
 if (maze[x][y].nth) {
 mf.line(x, y + 1, x + 1, y + 1);
 }
 if (maze[x][y].wst) {
 mf.line(x, y, x, y + 1);
 }
 if (maze[x][y].est) {
 mf.line(x + 1, y, x + 1, y + 1);
 }
 }
 }
 delay(LONG);
 }
private void delay(int t) {
 // sleep until the next time we\'re allowed to draw
 long millis = System.currentTimeMillis();
 if (millis < nextDraw) {
 try {
 Thread.sleep(nextDraw - millis);
 } catch (InterruptedException e) {
 System.out.println(\"Error sleeping\");
 }
 millis = nextDraw;
 }
 // when are we allowed to draw again
 nextDraw = millis + t;
 }
private void drawCircle(Color c, double x, double y, double size) {
 mf.setFillColor(c);
 mf.filledCircle(x + 0.5, y + 0.5, size);
 }
   
 public void findShortestPath() {
 // Your code goes here!!!!!
 }
 }
class MazeCell {
 // nth, sth, est, wst used to identify walls - true indicates wall present
 boolean nth, sth, wst, est;
 // used to indicate that a cell has already been processed
 boolean visited;
 // used to facilitate finding the neighbors of a cell
 int row, col;
public MazeCell(int i, int j) {
 row = i;
 col = j;
 // All walls are initially present for every cell
 nth = sth = est = wst = true;
 // Initially no cells have been visited
 visited = false;
 }
 }
class MazeMap {
 MazeCell nFromCenter = null;
 MazeMap nMinus1FromCenter = null;
 }













