迷宫代码:
截图如下:
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;
}
}