int ** generatemaze(int ** maze, int x, int y)
{ int direction;
maze[x][y] =0; // 標示此格已設定
// Form1->Memo2->Lines->Add("(x,y,dir)="+IntToStr(x)+","+IntToStr(y)+","+IntToStr(direction));
while (maze[x][y+2]==1 || maze[x+2][y]==1 || maze[x][y-2]==1 || maze[x-2][y]==1) // 如果不是外牆
{ direction = rand()%4+1; // 決定下一個位置
if (direction==1 && maze[x][y+2]==1) // 向右走
{ maze[x][y+1] =0; // 拆掉右牆
// Form1->Memo2->Lines->Add("(x,y,dir)="+IntToStr(x)+","+IntToStr(y+1)+","+IntToStr(direction));
maze = generatemaze(maze, x,y+2);
}
else if (direction==2 && maze[x-2][y]==1) // 向上走
{ maze[x-1][y] =0; // 拆掉上牆
maze = generatemaze(maze, x-2,y);
}
else if (direction==3 && maze[x][y-2]==1) // 向左走
{ maze[x][y-1] =0; // 拆掉右牆
maze = generatemaze(maze, x,y-2);
}
else if (direction==4 && maze[x+2][y]==1) // 向下走
{ maze[x+1][y] =0; // 拆掉上牆
maze = generatemaze(maze, x+2,y);
}
}
return maze;
}
//--------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{ int i, j;
if (maze) // delete the previous maze
{ for (int i=0; i<m; i++) delete(maze[i]);
delete(maze);
}
m = Edit1->Text.ToInt();
n = Edit2->Text.ToInt();
maze = new int * [m];
for (int i=0; i<m; i++)
{ maze[i] = new int [n];
}
int Start_i=1, Start_j=1, End_i=m-2, End_j=n-2;
int x, y;
// srand(time(NULL));
for (x=0; x<m; x++)
{ for (y=0; y<n; y++)
{ if (x==0 || y==0 || x==m-1 || y==n-1 ) maze[x][y] = 2; // 設定外牆
else maze[x][y] = 1; // 初始迷宮內部
}
}
maze = generatemaze(maze, End_i, End_j); // 產生迷宮
maze[Start_i][Start_j-1] =0; // 拆掉入口左牆
maze[End_j][End_j+1] =0; // 拆掉出口右牆
StringGrid1->RowCount = m;
StringGrid1->ColCount = n;
for (i=0; i<m; i++)
for (j=0; j<n; j++)
StringGrid1->Cells[j][i] = maze[i][j];
}