import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
public class maziness {
private int M;//行数
private int N;//列数
private int[] visitMatrix;//搜索是判断是否曾被访问过
private int[][] colMatrix;//保存要输出的的'|'矩阵
private int[][] rowMatrix;//保存要输出的的'_'矩阵
private Random random;//用来生成随机数,保证迷宫的复杂程度
public maziness(int M ,int N){
this.M=M;
this.N=N;
visitMatrix=new int[M*N];
colMatrix = new int[M][N+1];
rowMatrix = new int[M+1][N];
init(colMatrix,M,N+1);
init(rowMatrix,M+1,N);
for (int i=0;i
visitMatrix[i]=0;
random = new Random();
}
private void init(int matrix[][],int M ,int N){
for (int i=0;i
for (int j=0;j
matrix[i][j]=1;
}
//返回num周围可用的邻居,即没被访问过,也没到达边缘
private void availableNeigbers(ArrayList list,int num){
int allNeigber[]=new int[4];
if (num%N==1){
allNeigber[0]=num-N;
allNeigber[1]=num+N;
allNeigber[2]=num+1;
allNeigber[3]=-1;
}
else if (num%N==0){
allNeigber[0]=num-N;
allNeigber[1]=num+N;
allNeigber[2]=num-1;
allNeigber[3]=-1;
}
else{
allNeigber[0]=num-N;
allNeigber[1]=num+N;
allNeigber[2]=num-1;
allNeigber[3]=num+1;
}
for (int i=0;i<4;i++){
if (allNeigber[i]>0 & allNeigber[i]<=M*N)
if (visitMatrix[allNeigber[i]-1]==0 )
list.add(allNeigber[i]);
}
}
//返回随机选出的可用邻居
private int neigber(int num){
ArrayList list=new ArrayList();
availableNeigbers(list,num);
if (list.isEmpty())
return -1;
else{
return (Integer) list.get(random.nextInt(list.size()));
}
}
//移除num1和num2之间的墙
private void removeWall(int num1,int num2){
int x1=(num1+N-1)/N-1;
int y1=(num1-1)%N;
if (Math.abs(num1-num2)==1){
if (num1>num2)
colMatrix[x1][y1]=0;
else
colMatrix[x1][y1+1]=0;
}
else {
if (num1>num2)
rowMatrix[x1-1][y1]=0;
else
rowMatrix[x1][y1]=0;
}
}
//生成迷宫
public void process(){
ArrayList list=new ArrayList();
int curr=(M*N)/2;
visitMatrix[curr-1]=1;
list.add(curr);
int tmp;
while (!list.isEmpty()){
tmp=neigber(curr);
if (tmp>0){
visitMatrix[tmp-1]=1;
removeWall(curr,tmp);
curr=tmp;
list.add(curr);
}
else
curr=(Integer) list.remove(list.size()-1);
}
}
//绘制迷宫,并输出到txt文件中
public void draw(FileOutputStream fos){
try {
fos.write(' ');
fos.write(' ');
for (int i=0;i
fos.write(' ');
fos.write('_');
}
fos.write('\r');
for (int i=0;i
int j;
for (j=0;j
if (colMatrix[i][j]==1)
fos.write('|');
else
fos.write(' ');
if (rowMatrix[i][j]==1)
fos.write('_');
else
fos.write(' ');
}
if (i!=M-1 || j!=N){
fos.write('|');
fos.write('\r');
}
}
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
FileOutputStream fos=new FileOutputStream("F://maze.txt");
maziness m=new maziness(30,60);
m.process();
m.draw(fos);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(e);
}
}
}