2012-11-01 127 views
2

我目前正在研究迷宮生成程序,使用深度優先搜索。我有以下代碼,但我無法弄清楚我做錯了什麼。我試圖讓X之間說出哪些是牆壁。但它會覆蓋它們,並將路徑放在一起。任何幫助都會很棒。以下是輸出。DFS迷宮發電機

. . . # # # # # # # 
. . . . # . . . . . 
. . . . # . # # # . 
. . # . # . . . # . 
. . # # # # # . # # 
. . . . # . . . # # 
. # # . # . # # # # 
. # # . . . # # # # 
. . . . . # # # # # 
# # # # # # # # # # 

import java.util.Random; 

public class DepthFirstSearch { 

    private Stack stack; 
    public DepthFirstSearch() {} 
    public char[][] DFS (int size, char[][] maze) { 

     Random myRand = new Random(); 
     stack = new Stack(size); 
     int x = myRand.nextInt(size); 
     while (x % 2 == 0) 
      x = myRand.nextInt(size); 
     int y = myRand.nextInt(size); 
     while (y % 2 == 0) 
      y = myRand.nextInt(size); 

     maze[x][y] = ' '; 
     int total = (size * size)/4; 
     int visited = 1; 
     int random[] = new int[4]; 
     int totalrand; 

     while (visited < total) { 
      totalrand = 0; 
      if (x > 1 && maze[x - 2][y] == 'X') 
       random[totalrand++] = 1; 
      if (x < size - 2 && maze[x + 2][y] == 'X') 
       random[totalrand++] = 2; 
      if (y > 1 && maze[x][y - 2] == 'X') 
       random[totalrand++] = 3; 
      if (y < size - 2 && maze[x][y + 2] == 'X') 
       random[totalrand++] = 4; 

      if (totalrand > 0) { 
       switch(random[myRand.nextInt(totalrand)]) { 
        case 1: maze[x-2][y] = maze[x-1][y] = ' '; 
          x -= 2; 
          stack.push(x * size + y); 
          visited++; 
          break; 
        case 2: maze[x+2][y] = maze[x+1][y] = ' '; 
          x += 2; 
          stack.push(x * size + y); 
          visited++; 
          break; 
        case 3: maze[x][y-2] = maze[x][y-1] = ' '; 
          y -= 2; 
          stack.push(x * size + y); 
          visited++; 
          break; 
        case 4: maze[x][y+2] = maze[x][y+1] = ' '; 
          y += 2; 
          stack.push(x * size + y); 
          visited++; 
          break; 
       } 
      } 
      else { 
       int vert = stack.pop(); 
       x = vert/size; 
       y = vert % size; 
      } 
     } 
     return maze; 
    } 

} 
+1

我原本是把迷宮作爲一個字符數組,但是我看到有人在其他地方發帖使它成爲一個字符串和.equals()它。但相同的結果。 –

+1

*(不是回答,因此評論)* ...按照慣例Java類名稱應該以大寫字母開頭(例如*你應該有'堆棧'而不是'堆棧')和小寫的方法,所以你明白了向後。此外,有一個名爲「dfs」的類/構造函數和一個名爲「DFS」的方法,並依靠區分大小寫來區分它們,這種情況充其量是令人困惑的。 – TacticalCoder

+0

我已更新它。 –

回答

1

事實證明,這是完美的。我試圖用我的堆棧來提高效率,並把它搞砸了。所以使用一個工作堆棧,它可以很好地工作。