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!!!!!
65W Charger Compatible with Microsoft Surface Pro 11, 10, 9, 8, 7+, 7, 6, 5, 4, 3, X, Power Adapter for Windows Surface Laptop 7/6/5/4/3/2/1, Go Tablet, Book 3/2/1, Support 44W, 36W, LED, 10FT
$26.99 (as of July 15, 2026 09:59 GMT -04: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 - 118W USB C Charger Fast Charger Compatible with MacBook Pro/Air, M1 M2 M3 M4 M5, ipad Pro, Samsung Galaxy and More, Include Charge Cable
$26.83 (as of July 15, 2026 09:59 GMT -04: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.)Apple 2026 MacBook Neo 13-inch Laptop with A18 Pro chip: Built for AI and Apple Intelligence, Liquid Retina Display, 8GB Unified Memory, 256GB SSD Storage, 1080p FaceTime HD Camera; Indigo
$566.19 (as of July 15, 2026 09:59 GMT -04: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.)UGREEN USB C Hub 5 in 1 Multiport USB Adapter 4K HDMI, 100W Power Delivery, 3 USB-A Data Ports, USB C Dongle for MacBook Pro/Air M5/M4/M3/M2/M1, iPad Pro, iMac, iPhone 16 Pro/Pro Max, XPS, Thinkpad
$9.99 (as of July 15, 2026 09:59 GMT -04: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 USB C Hub 5-in-1 USB Hub for Laptops, 4K HDMI USB-C Multiport Adapter | 90W Max Power Delivery, 3 USB A Data Ports USB C Dongle, Compact for MacBook, Dell, and More (Charger Not Included)
$12.99 (as of July 15, 2026 09:59 GMT -04: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.
