刚在网上看到这个的算法的分析,然后写了一个C#版的。算法分析地址:http://www.j2megame.org/index.php/content/view/2120/125.html
算法原理:从起点开始,随机选择一个方向移动,一直移动到终点,则移动的路径便是迷宫的路径。移动过程中要保证路径不要相交,不要超出边界,生成效果
public partial class MainForm : Form
{
private Bitmap bitmap;
private const int SIZE=10;
private const int MAXMAZE=50;
private int[,] maze_matrix;
public MainForm()
{
InitializeComponent();
maze_matrix=new int[MAXMAZE+2,MAXMAZE+2];
}
void BtnCreateClick(object sender, EventArgs e)
{
makeMaze(10);
Debugs(10);
Render(10);
}
void Maze_panelMouseDown(object sender, MouseEventArgs e)
{
}
void Maze_panelPaint(object sender, PaintEventArgs e)
{
}
private void makeMaze(int size){
for (int i = 0; i < size*2+2; ++i) {
for (int j = 0; j < size*2+2; ++j) {
maze_matrix[i,j]=1;
}
}
for(int z1=0, z2=2*size+2; z1<=2*size+2; ++z1)
{
maze_matrix[z1,0] = 0;
maze_matrix[z1,z2] = 0;
}
for(int z1=0, z2=2*size+2; z1<=2*size+2; ++z1)
{
maze_matrix[0,z1] = 0;
maze_matrix[z2,z1] = 0;
}
//建立出口
maze_matrix[2,1] = 0;
maze_matrix[2*size,2*size+1] = 0;
Random random=new Random(GetRandomSeed());
searchPath(random.Next(size)+1,random.Next(size)+1);
}
public int searchPath(int x,int y ){
int[,] dir= {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int zx = x*2;
int zy = y*2;
int turn;
maze_matrix[zx,zy] = 0;
Random random=new Random(GetRandomSeed());
turn=random.Next(2)==0?1:3;
for (int i = 0,next=random.Next(4); i < 4; ++i,next=(next+turn)%4) {
if (maze_matrix[zx+2*dir[next,0],zy+2*dir[next,1]]==1) {
maze_matrix[zx+dir[next,0],zy+dir[next,1]]=0;
searchPath(x+dir[next,0],y+dir[next,1]);
}
}
return 0;
}
public void Debugs(int size){
Form f=new Form();
f.Size=new Size(400,300);
TextBox textbox=new TextBox();
textbox.Multiline=true;
textbox.Size=new Size(400,300);
f.Controls.Add(textbox);
f.Show();
for(int z2=1; z2<=size*2+1; z2++)
{
for(int z1=1;z1<=size*2+1;z1++){
textbox.Text+=maze_matrix[z2,z1]==0?" ":"1";
}
textbox.Text+="\r\n";
}
}
int GetRandomSeed()
{
byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32(bytes, 0);
}
public void Render(int size){
this.maze_panel.Refresh();
bitmap=new Bitmap(300,300,PixelFormat.Format32bppArgb);
Graphics g=Graphics.FromImage(bitmap);
for(int z2=1; z2<=size*2+1; z2++)
{
for(int z1=1;z1<=size*2+1;z1++){
if (maze_matrix[z2,z1]==1) {
g.DrawRectangle(new Pen(Color.Red),new Rectangle(z2*SIZE,z1*SIZE,SIZE,SIZE));
}
}
}
Graphics mazeg=this.maze_panel.CreateGraphics();
mazeg.DrawImage(bitmap,0,0);
}
}