This is the code to make a mouse maze with recursion using a stack and a list with a GUI in Java.
First we will make a Mouse class
Mouse.java
import java.util.ArrayList; import java.util.List; import java.util.Stack; public class Mouse { public int x,y; public Stack<Coordinate> decisions; public List<Coordinate> solution; public Mouse(int x, int y){ this.x = x; this.y = y; decisions = new Stack<Coordinate>(); solution = new ArrayList<Coordinate>(); } }
Then we will make the coordinate class
Coordinate.java
public class Coordinate { public int x,y; public Coordinate(int x,int y){ this.x = x; this.y = y; } @Override public boolean equals(Object obj) { boolean sameSame = false; if (obj != null && obj instanceof Coordinate) { if(this.x == ((Coordinate)obj).x && this.y == ((Coordinate)obj).y){ sameSame = true; } } return sameSame; } }
Now its time for the decision class
Decision.java
public class Decision { public boolean up,down,left,right; public int x,y; public Decision(int x, int y){ up = down = left = right = false; this.x = x; this.y = y; } public Decision(boolean up,boolean down,boolean right,boolean left){ this.up = up; this.down = down; this.right = right; this.left = left; } public void setLeft(boolean left){ this.left = left; } public void setRight(boolean right){ this.right = right; } public void setUp(boolean up){ this.up = up; } public void setDown(boolean down){ this.down = down; } @Override public String toString() { // TODO Auto-generated method stub return x + " x -- y " + y; } }
Now we have to make the maze class which does most of the hard work
Maze.java
import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JComponent; public class Maze extends JComponent{ public char[][] maze = null; public Rectangle[][] rects = null; public boolean mousebool = false; public boolean backtrack = false; public Mouse mouse; public Random random = new Random(); public Coordinate startingPoint; public boolean first = true; public boolean solv = true; public int lastx,lasty; public String navigation = "working!!!"; @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if(maze != null){ for(int i = 0;i < maze.length;i++){ for(int j = 0;j < maze[0].length;j++){ if(maze[i][j] == '1'){ g.setColor(Color.BLACK); g.fillRect(rects[i][j].x, rects[i][j].y, rects[i][j].width, rects[i][j].height); g.setColor(Color.WHITE); g.drawRect(rects[i][j].x, rects[i][j].y, rects[i][j].width, rects[i][j].height); }else if(maze[i][j] == '0'){ g.setColor(Color.white); g.fillRect(rects[i][j].x, rects[i][j].y, rects[i][j].width, rects[i][j].height); g.setColor(Color.BLACK); g.drawRect(rects[i][j].x, rects[i][j].y, rects[i][j].width, rects[i][j].height); } } } if(mousebool){ g.setColor(Color.PINK); g.fillOval(rects[mouse.x][mouse.y].x, rects[mouse.x][mouse.y].y, rects[mouse.x][mouse.y].width, rects[mouse.x][mouse.y].height); } } } public void setMaze(char[][] maze){ mousebool = false; this.maze = maze; rects = new Rectangle[maze.length][maze[0].length]; for(int i = 0;i < rects.length;i++){ for(int j = 0;j < rects[0].length;j++){ rects[i][j] = new Rectangle(i * (getWidth()/rects.length),j * (getHeight()/rects[0].length) ,getWidth()/rects.length,getHeight()/rects[0].length); } } repaint(); } public void setMouse(int x,int y){ mousebool = true; mouse = new Mouse(x,y); startingPoint = new Coordinate(x,y); mouse.solution.add(new Coordinate(x,y)); mouse.decisions.push(new Coordinate(x,y)); first = true; repaint(); } public void solve(){ if(mouse.x > 0 && mouse.x < maze.length - 1 && mouse.y > 0 && mouse.y < maze[0].length - 1 && mouse.decisions.size() > 0){ //System.out.println(wasHere(coord) + "now"); //north System.out.println(wasHere(new Coordinate(mouse.x,mouse.y - 1)) + "north"); if (!(maze[mouse.x][mouse.y - 1] == '1') && !wasHere(new Coordinate(mouse.x,mouse.y - 1))) mouse.decisions.push(new Coordinate(mouse.x,mouse.y - 1)); //east System.out.println(wasHere(new Coordinate(mouse.x + 1,mouse.y)) + "east"); if (!(maze[mouse.x + 1][mouse.y] == '1') && !wasHere(new Coordinate(mouse.x + 1,mouse.y))) mouse.decisions.push(new Coordinate(mouse.x + 1,mouse.y)); //west if (!(maze[mouse.x - 1][mouse.y] == '1') && !wasHere(new Coordinate(mouse.x - 1,mouse.y))) mouse.decisions.push(new Coordinate(mouse.x - 1,mouse.y)); //south if(!(maze[mouse.x][mouse.y + 1] == '1') && !wasHere(new Coordinate(mouse.x,mouse.y + 1))) mouse.decisions.push(new Coordinate(mouse.x,mouse.y + 1)); Coordinate coord = mouse.decisions.pop(); mouse.x = coord.x; mouse.y = coord.y; mouse.solution.add(coord); ActionListener taskPerformer = new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { solve(); } }; javax.swing.Timer t = new javax.swing.Timer( 250, taskPerformer); t.setRepeats(false); t.start(); //solve(); repaint(); }else{ solv = false; if(mouse.decisions.size() == 0){ mouse.solution.clear(); navigation = "there is no solution"; }else{ mouse.solution.clear(); findPath(startingPoint.x,startingPoint.y); navigation = "maze complete"; } } //solve(); } public boolean findPath(int x,int y){ if(x < 0 || y < 0 || x > maze.length - 1 || y > maze[0].length - 1)return false; if(!(x > 0 && x < maze.length - 1 && y > 0 && y < maze[0].length - 1) && maze[x][y] == '0') { mouse.solution.add(new Coordinate(x,y)); return true;// && maze[x][y] == '0') return true;//&& maze[x][y] == '0') return true; } if(maze[x][y] == '1') return false; mouse.solution.add(new Coordinate(x,y)); if(!mouse.solution.contains(new Coordinate(x,y - 1))) if(findPath(x,y-1) == true) return true; if(!mouse.solution.contains(new Coordinate(x+1,y))) if(findPath(x + 1,y) == true) return true; if(!mouse.solution.contains(new Coordinate(x,y+1))) if(findPath(x,y + 1)== true) return true; if(!mouse.solution.contains(new Coordinate(x-1,y))) if(findPath(x - 1,y)== true) return true; mouse.solution.remove(new Coordinate(x,y)); return false; } public boolean wasHere(Coordinate coord){ return mouse.solution.contains(coord); } public void TraverseMouse(int x){ if(x < mouse.solution.size()){ Coordinate coord = mouse.solution.get(x); mouse.x = coord.x; mouse.y = coord.y; final int xt = x+=1; ActionListener taskPerformer = new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { TraverseMouse(xt); } }; javax.swing.Timer t = new javax.swing.Timer( 250, taskPerformer); t.setRepeats(false); t.start(); } repaint(); } public String Navigation(){ return navigation; } }
And finally the Main class to make the GUI
Main.java
import java.awt.BorderLayout; import java.awt.Container; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; public class Main { public static int width; public static int height; public static char[][] maze1; public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(Exception ex) { ex.printStackTrace(); } SwingUtilities.invokeLater(new Runnable() { public void run() { create(); } }); } public static void create(){ JFrame frame = new JFrame("Mouse Maze"); final Maze maze = new Maze(); frame.setSize(500, 500); frame.setLocation((int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2)-264, (int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()/2)-330); maze.setSize(400, 400); Container content = frame.getContentPane(); //Creates a new container content.setLayout(new BorderLayout()); frame.add(maze,BorderLayout.CENTER); //frame.add(maze); JPanel panel = new JPanel(new BorderLayout()); JPanel panel1 = new JPanel(new BorderLayout()); JPanel panel2 = new JPanel(new BorderLayout()); JPanel finish = new JPanel(new BorderLayout()); final JLabel textFile = new JLabel(" ex: maze.txt "); JButton pickFile = new JButton("Pick file"); pickFile.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( ".txt file", "txt"); chooser.setFileFilter(filter); int returnVal = chooser.showOpenDialog(null); if(returnVal == JFileChooser.APPROVE_OPTION) { try { BufferedReader read = new BufferedReader(new FileReader(chooser.getSelectedFile())); String rea = read.readLine(); String[] split = rea.split(" "); width = Integer.valueOf(split[0]); height = Integer.valueOf(split[1]); String readline; int num = 0; maze1 = new char[width][height]; while((readline = read.readLine()) != null){ char[] ch = readline.toCharArray(); for(int i = 0;i < ch.length;i++){ maze1[i][num] = ch[i]; } num++; } maze.setMaze(maze1); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } textFile.setText(chooser.getSelectedFile().getName()); }else{ } } }); panel.add(pickFile,BorderLayout.CENTER); panel.add(textFile,BorderLayout.WEST); JButton setMouse = new JButton("Set Mouse"); final JTextField mouseText = new JTextField("x,y",15); JButton solve = new JButton("SOLVE"); JButton traverse = new JButton("TRAVERSE"); final JLabel error = new JLabel("ERROR MESSAGES!!!!"); panel2.add(solve,BorderLayout.NORTH); panel2.add(traverse,BorderLayout.CENTER); panel2.add(error,BorderLayout.SOUTH); panel1.add(setMouse,BorderLayout.CENTER); panel1.add(mouseText,BorderLayout.WEST); finish.add(panel,BorderLayout.NORTH); finish.add(panel1,BorderLayout.CENTER); finish.add(panel2,BorderLayout.SOUTH); //content.setLayout(new BorderLayout()); content.add(finish, BorderLayout.SOUTH); traverse.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub maze.TraverseMouse(0); } }); solve.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub maze.solve(); error.setText(maze.navigation); } }); setMouse.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { String mousePosition = mouseText.getText(); String[] splitposition = mousePosition.split(","); try{ int x = Integer.valueOf(splitposition[0]); int y = Integer.valueOf(splitposition[1]); if(x >= width || y >= height){ error.setText("those coordinates are not in range of your maze, try again, 0-"+ (width - 1)+",0-"+(height-1)); }else if(maze1[x][y] == '1'){ error.setText("you cannot place the mouse on a wall, try again"); }else{ maze.setMouse(x, y); error.setText("coordinates set."); } }catch(NumberFormatException e){ error.setText("You Must enter the mouse position \"x,y\" example: 10,20"); }catch(ArrayIndexOutOfBoundsException e){ e.printStackTrace(); error.setText("You Must enter the mouse position \"x,y\" example: 10,20"); } } }); //frame.add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //makes it so you can close frame.setVisible(true); //char[][] ch = new char[][]{{'1','1','1','1'},{'1','0','0','1'},{'1','0','0','1'},{'1','1','1','1'}}; //maze.setMaze(ch); } }
You will have to use a text file in this format where a 1 is a wall and a 0 is part of the path remember .txt file the first line means 10 width and 5 height for the maze
10 5 1111111111 1010001111 1011011111 1011000011 1111111111
You can try it and alter it to your own code, thanks for reading.
Donate or Subscribe to support Copypasteearth!!!!!
New Amazon Fire HD 8 tablet, 8” HD Display, 3GB memory, 32GB, designed for portable entertainment, Black, (2024 release)
$99.99 (as of December 30, 2024 00:17 GMT -05:00 - More infoProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Charger for Dell Laptop Computer 65W 45W Round Tip Power Adapter
$9.90 (as of December 30, 2024 00:17 GMT -05:00 - More infoProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Charger for MacBook Air MacBook Pro 13 14 15 16 inch 2024 2023 2022 2021 2020, M1 M2 M3 M4 Laptop 70W USB C Power Adapter, iPad, LED, 6.6FT USB-C Cable, Charging as Fast as Original Quality
$27.99 (as of December 30, 2024 00:17 GMT -05:00 - More infoProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Mac Book Pro Charger - 60W T-Tip Magnetic Charger Power Adapter, Universal Laptop Charger Compatible with Mac Book Air/Mac Book Pro 13-Inch Retina Display(After 2012)
$17.54 (as of December 30, 2024 00:17 GMT -05:00 - More infoProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Anker 553 USB-C Hub, 8-in-1 USB C Dock, Dual 4K HDMI USB C to USB Adapter, 1 Gbps Ethernet USB Hub, 100W Power Delivery, SD Card Reader for MacBook Pro, XPS and More
$49.99 (as of December 30, 2024 00:17 GMT -05:00 - More infoProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Author: John Rowan
I am a Senior Android Engineer and I love everything to do with computers. My specialty is Android programming but I actually love to code in any language specifically learning new things.