迷宫代码:
截图如下:

package com.zxl.maze;

/*
 * 抽象类表示选择不同的算法*/
public abstract class AbstractMap
{
    /*
     * 得到数据*/
    public abstract boolean[][] getData(int m,int n);
    /*
     * 重置*/
    public abstract void reset(int m,int n);
}


package com.zxl.maze;

/*
 *深度优先,生成迷宫*/
import java.awt.Point;
import java.util.Random;
import java.util.Stack;

public class DFSMap extends AbstractMap
{
    private int m = 30, n = 30;
    private boolean a[][];
    private int currX, currY;
    private Stack<Point> stack;// 保存已走路径
    private int[] X_GO1 = { -2, 2, 0, 0 };
    private int[] Y_GO1 = { 0, 0, 2, -2 };
    private int[] X_GO2 = { -1, 1, 0, 0 };
    private int[] Y_GO2 = { 0, 0, 1, -1 };

    public DFSMap()
    {
        stack = new Stack<Point>();
    }

    @Override
    public boolean[][] getData(int m,int n)// 得到数据
    {
        // TODO Auto-generated method stub

        reset(m, n);
        return a;
    }

    @Override
    public void reset(int m, int n)// 重置
    {
        // TODO Auto-generated method stub

        a = new boolean[2 * m + 1][2 * n + 1];
        this.m = 2 * m + 1;
        this.n = 2 * n + 1;
        for (int i = 0; i < this.m; i++)
            for (int j = 0; j < this.n; j++)
                a[i][j] = false;
        currX = 1;
        currY = 1;
        stack.clear();
        stack.push(new Point(1, 1));
        a[1][0] = true;
        a[1][1] = true;
        start();
    }

    private boolean check()// 判断是否全部走过。。。
    {
        for (int i = 1; i < m; i += 2)
        {
            for (int j = 1; j < n; j += 2)
            {
                if (a[i][j] == false)
                    return false;
            }
        }
        return true;
    }

    private void forward()// 后退一步
    {
        if (stack.size() > 0)
        {
            Point p = stack.pop();
            currX = (int) p.getX();
            currY = (int) p.getY();
        }
        else
        {
            goRandPosition();
        }
    }

    private void goRandPosition()
    {
        int i, j;
        while (true)
        {
            i = (int) (Math.random() * m);
            j = (int) (Math.random() * n);
            if (a[i][j] == true && i % 2 == 1 && j % 2 == 1)
            {
                stack.push(new Point(i, j));
                currX = i;
                currY = j;
                break;
            }
        }
    }

    private void start()// 具体操作
    {
        while (!check())
        {
            go();
        }
        a[m - 2][n - 1] = true;
    }

    private void go()
    {
        int orders[] = getOrder(4);
        for (int i = 0; i < orders.length; i++)
        {
            if (isSafe(currX + X_GO1[orders[i]], currY + Y_GO1[orders[i]]))// 上
            {
                goNext(orders[i]);
                return;
            }
        }
        forward();
    }

    private void goNext(int i)// 下一步
    {
        // TODO Auto-generated method stub
        a[currX + X_GO1[i]][currY + Y_GO1[i]] = true;
        a[currX + X_GO2[i]][currY + Y_GO2[i]] = true;
        stack.push(new Point(currX, currY));
        currX += X_GO1[i];
        currY += Y_GO1[i];
    }

    private int[] getOrder(int i)// 产生随机序列
    {
        // TODO Auto-generated method stub
        int a[] = new int[i];
        Random ran = new Random();
        for (int j = 0; j < i; j++)
            a[j] = j;
        for (int k = 0; k < i; k++)
        {
            int r1 = ran.nextInt(i);
            int r2 = ran.nextInt(i);
            int b = a[r1];
            a[r1] = a[r2];
            a[r2] = b;
        }
        return a;
    }

    private boolean isSafe(int x, int y)
    {

        if (x < 0 || x >= m || y < 0 || y >= n || a[x][y] == true)
        {
            return false;
        }
        return true;
    }

}

package com.zxl.maze;

/*
 * 随机prim算法的核心是(翻译的维基):
 1、让迷宫全是墙
 2、选一个格作为迷宫的通路,然后把它的邻墙放入列表
 3、当列表里还有墙时
 ——1、从列表里随机选一个墙,如果它对面的格子不是迷宫的通路
 ————1、把墙打通,让对面的格子成为迷宫的通路
 ————2、把那个格子的邻墙加入列表
 ——2、如果对面的格子已经是通路了,那就从列表里移除这面墙*/
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class PriMap extends AbstractMap
{
    private int m = 0, n = 0;
    private boolean a[][];
    private int currX, currY;// 记录当前格子位置
    private List<Point> set;// 用作队列,存放墙
    private int[] X_GO1 = { 1, 0, -1, 0 };
    private int[] Y_GO1 = { 0, -1, 0, 1 };

    public void reset(int m, int n)
    {
        this.m = 2 * m + 1;
        this.n = 2 * n + 1;
        a = new boolean[this.m][this.n];
        for (int i = 0; i < this.m; i++)
            for (int j = 0; j < this.n; j++)
                a[i][j] = false;
        currX = 1;
        currY = 1;
        set.clear();
        set.add(new Point(1, 2));
        set.add(new Point(2, 1));
        a[1][0] = true;
        a[1][1] = true;
        go();
        a[this.m - 2][this.n - 1] = true;

    }

    public void go()
    {
        while (set.size() > 0)
        {
            if (choiceWall())// 选择墙
            {
                addWall(currX, currY);// 将墙的临墙加入队列
            }
        }

    }

    private boolean choiceWall()
    {
        // TODO Auto-generated method stub
        Random r = new Random(System.currentTimeMillis());
        Point p = set.remove(r.nextInt(set.size()));
        int x = (int) p.getX();
        int y = (int) p.getY();
        if (test(x, y) == 1)
        {
            if (isSafe(x - 1, y) && a[x - 1][y] == false)
            {
                a[x][y] = true;
                currX = x - 1;
                currY = y;
                a[currX][currY] = true;
                return true;
            }
            else if (isSafe(x + 1, y) && a[x + 1][y] == false)
            {
                a[x][y] = true;
                currX = x + 1;
                currY = y;
                a[currX][currY] = true;
                return true;
            }
        }
        else if (test(x, y) == 2)
        {
            if (isSafe(x, y - 1) && a[x][y - 1] == false)
            {
                a[x][y] = true;
                currX = x;
                currY = y - 1;
                a[currX][currY] = true;
                return true;
            }
            else if (isSafe(x, y + 1) && a[x][y + 1] == false)
            {
                a[x][y] = true;
                currX = x;
                currY = y + 1;
                a[currX][currY] = true;
                return true;
            }
        }
        return false;
    }

    private void addWall(int x, int y)
    {
        // TODO Auto-generated method stub
        for (int i = 0; i < X_GO1.length; i++)
        {
            if (isSafe(currX + X_GO1[i], currY + Y_GO1[i]))
            {
                if (!set.contains(new Point(currX + X_GO1[i], currY + Y_GO1[i])))
                {
                    set.add(new Point(currX + X_GO1[i], currY + Y_GO1[i]));
                }
            }
        }
    }

    private int test(int x, int y)
    {
        if (x % 2 == 0)
            return 1;// 竖线
        else if (y % 2 == 0)
            return 2;// 横线
        else
            return 0;// 出错了
    }

    private boolean isSafe(int x, int y)
    {

        if (x <= 0 || x >= m || y <= 0 || y >= n || a[x][y] == true)
        {
            return false;
        }
        return true;
    }

    @Override
    public boolean[][] getData(int m,int n)
    {
        // TODO Auto-generated method stub
        set = new ArrayList<Point>();
        reset(m, n);
        return a;
    }
}

package com.zxl.maze;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;

public class MainPanel extends JPanel
{
    int x = 0;
    int y = 0;
    boolean b[][]=null;

    public MainPanel()
    {
        this.setSize(400, 400);
        
    }

    public void setMap(boolean b[][])
    {
        this.b = b;
    }

    @Override
    public Dimension getPreferredSize()
    {
        // TODO Auto-generated method stub
        return new Dimension(400,400);
    }

    public void paintMap(int x, int y)
    {
        this.x = x;
        this.y = y;
        
        repaint();
    }

    @Override
    public void paintComponent(Graphics g)
    {
        // TODO Auto-generated method stub
        if (x == 0&&y==0)
        {
            g.clearRect(0, 0, this.getWidth(), this.getHeight());
        }
        else 
        {
            for(int i=0;i<=x;i++)
                for(int j=0;j<=y;j++)
                {
                    if (b[i][j] == true)
                    {
                        g.setColor(Color.blue);
                        g.fillRect(50 + i * 10, 50 + j* 10, 10, 10);
                    }
                    else
                    {
                        g.setColor(Color.red);
                        g.fillRect(50 + i * 10, 50 + j * 10, 10, 10);
                    }

                }
        }
    }

}

package com.zxl.maze;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MainFrame extends JFrame
{
    //JButton resetButton;
    Container con;
    boolean b[][];
    JMenu menu;
    JMenuBar bar;
    JMenuItem item;
    MainPanel pan=new MainPanel();
    public MainFrame()
    {
        this.setSize(600,550);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //resetButton=new JButton("重    绘");
        con=this.getContentPane();
        con.setLayout(new BorderLayout());
        //con.add(resetButton,BorderLayout.SOUTH);
        menu=new JMenu("菜单");
        item=new JMenuItem("绘制地图");
        bar=new JMenuBar();
        bar.add(menu);
        menu.add(item);
        this.add(pan);
        this.setJMenuBar(bar);
        this.setVisible(true);
        //setMap();
        item.addActionListener(new ActionListener()
        {
            
            @Override
            public void actionPerformed(ActionEvent e)
            {
                // TODO Auto-generated method stub
                setMap();
                Thread t=new Thread(new DrawHandler(pan));
                t.start();
            }
        });
    }
    private void setMap()
    {
        // TODO Auto-generated method stub
        this.requestFocus();
        AbstractMap map=new DFSMap();
        b=map.getData(20, 20);
        pan.setMap(b);
        /*for(int i=0;i<b.length;i++)
        {
            for(int j=0;j<b[0].length;j++)
            {        
                pan.paintMap(i, j);    
                try
                {
                    Thread.sleep(10);
                }catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        }*/
    }


class DrawHandler implements Runnable{
    private MainPanel pan;
    public DrawHandler(MainPanel pan){
        this.pan=pan;
    }
    public void run(){
        for(int i=0;i<b.length;i++)
        {
            for(int j=0;j<b[0].length;j++)
            {        
                pan.paintMap(i, j);    
                try
                {
                    Thread.sleep(10);
                }catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        }
    }
}
}

package com.zxl.maze;

public class Test
{
    public static void main(String []args)
    {
        new MainFrame();
    }
}


package com.zxl.maze;

import java.util.Random;

/*
 *深度优先,生成迷宫*/

public class TreeMap extends AbstractMap
{
    private int m = 0, n = 0;
    private boolean a[][];
    private int currX, currY;
    private int[] X_GO1 = { -2, 2, 0, 0 };
    private int[] Y_GO1 = { 0, 0, 2, -2 };
    private int[] X_GO2 = { -1, 1, 0, 0 };
    private int[] Y_GO2 = { 0, 0, 1, -1 };

    @Override
    public boolean[][] getData(int m,int n)// 得到数据
    {
        // TODO Auto-generated method stub
        reset(m,n);
        return a;
    }

    @Override
    public void reset(int m, int n)// 重置
    {
        // TODO Auto-generated method stub
        a = new boolean[2 * m + 1][2 * n + 1];
        this.m = 2 * m + 1;
        this.n = 2 * n + 1;
        for (int i = 0; i < this.m; i++)
            for (int j = 0; j < this.n; j++)
                a[i][j] = false;
        currX = 1;
        currY = 1;
        a[1][0] = true;
        a[1][1] = true;
        start();
    }

    private boolean check()// 判断是否全部走过。。。
    {
        for (int i = 1; i < m; i += 2)
        {
            for (int j = 1; j < n; j += 2)
            {
                if (a[i][j] == false)
                    return false;
            }
        }
        return true;
    }

    private void forward()// 后退一步
    {
        int i, j;
        while (true)
        {
            i = (int) (Math.random() * m);
            j = (int) (Math.random() * n);
            if (a[i][j] == true && i % 2 == 1 && j % 2 == 1)
            {
                currX = i;
                currY = j;
                return;
            }
        }

    }

    private void start()// 具体操作
    {
        while (!check())
        {
            go();
        }
        a[m - 2][n - 1] = true;
    }

    private void go()
    {
        int orders[] = getOrder(4);
        for (int i = 0; i < orders.length; i++)
        {
            if (isSafe(currX + X_GO1[orders[i]], currY + Y_GO1[orders[i]]))// 上
            {
                goNext(orders[i]);
                return;
            }
        }
        forward();
    }

    private void goNext(int i)// 下一步
    {
        // TODO Auto-generated method stub
        a[currX + X_GO1[i]][currY + Y_GO1[i]] = true;
        a[currX + X_GO2[i]][currY + Y_GO2[i]] = true;
        currX += X_GO1[i];
        currY += Y_GO1[i];
    }

    private int[] getOrder(int i)// 产生随机序列
    {
        // TODO Auto-generated method stub
        int a[] = new int[i];
        Random ran = new Random();
        for (int j = 0; j < i; j++)
            a[j] = j;
        for (int k = 0; k < i; k++)
        {
            int r1 = ran.nextInt(i);
            int r2 = ran.nextInt(i);
            int b = a[r1];
            a[r1] = a[r2];
            a[r2] = b;
        }
        return a;
    }

    private boolean isSafe(int x, int y)
    {

        if (x < 0 || x >= m || y < 0 || y >= n || a[x][y] == true)
        {
            return false;
        }
        return true;
    }

}