迷宮本質上是一棵樹或一張圖。
根據劉老師的思維:迷宮最初狀態
![「算法基礎」迷宮生成](http://p2.ttnews.xyz/loading.gif)
//通過隨機隊列,產生隨機節點(類似於廣度)
import java.util.ArrayList;
public class RandomQueue
{ private ArrayList
queue; public RandomQueue(){
queue = new ArrayList
(); }
public void add(E e){
queue.add(e);
}
public E remove(){
if(queue.size() == 0)
throw new IllegalArgumentException("There's no element to remove in Random Queue");
int randIndex = (int)(Math.random()*queue.size());
E randElement = queue.get(randIndex);
queue.set(randIndex, queue.get(queue.size()-1));
queue.remove(queue.size()-1);
return randElement;
}
public int size(){
return queue.size();
}
public boolean empty(){
return size() == 0;
}
}
//隨機隊列,類似於深度
import java.util.LinkedList;
public class RandomQueue
{ private LinkedList
queue; public RandomQueue(){
queue = new LinkedList
(); }
public void add(E e){
if(Math.random() < 0.5)
queue.addFirst(e);
else
queue.addLast(e);
}
public E remove(){
if(queue.size() == 0)
throw new IllegalArgumentException("There's no element to remove in Random Qeuue");
if(Math.random() < 0.5)
return queue.removeFirst();
else
return queue.removeLast();
}
public int size(){
return queue.size();
}
public boolean empty(){
return size() == 0;
}
}
//隨機生成
private void run(){
setData(-1, -1);
RandomQueue
queue = new RandomQueue (); Position first = new Position(data.getEntranceX(), data.getEntranceY()+1);
queue.add(first);
data.visited[first.getX()][first.getY()] = true;
while(queue.size() != 0){
Position curPos = queue.remove();
for(int i = 0 ; i < 4 ; i ++){
int newX = curPos.getX() + d[i][0]*2;
int newY = curPos.getY() + d[i][1]*2;
if(data.inArea(newX, newY)
&& !data.visited[newX][newY]
&& data.maze[newX][newY] == MazeData.ROAD){
queue.add(new Position(newX, newY));
data.visited[newX][newY] = true;
setData(curPos.getX() + d[i][0], curPos.getY() + d[i][1]);
}
}
}
setData(-1, -1);
}
需要完整代碼請關注學點乾貨,點贊並轉發此文,私信乾貨菌獲取。
閱讀更多 學點乾貨 的文章
關鍵字: 技術