2012-10-17 63 views
0

我在製作迷宮,我想使用定義爲here的遞歸方法。但是,我需要一些幫助,以便隨機抽取它們時如何隨機打開這些線。現在我只需通過繪製起始和結束的x和y座標來創建線條(迷宮的牆壁)。我似乎無法找到一種簡單的方法來「清除」(或「打開」)部分線條。如何在java中隨機打開迷宮線

編輯:好吧,我需要更具體一些。我怎麼可以隨機選擇每個一行的地方「打開?」

編輯2:這裏是我想要做一些代碼:

public static void draw() { 
    // picks a random spot in the rectangle 
    Random r = new Random(); 
    int x0 = r.nextInt(w) 
    int y0 = r.nextInt(h) 

    // draws the 4 lines that are perpendicular to each other and meet 
    // at the selected point 
    StdDraw.line(x0, 0, x0, y0); 
    StdDraw.line(0, y0, x0, y0); 
    StdDraw.line(x0, h, x0, y0); 
    StdDraw.line(w, y0, x0, y0); 
} 

public static void main(String[] args) { 
    // set up the walls of the maze 
    // given w = width and h = height 
    StdDraw.setXscale(0, w); 
    StdDraw.setYscale(0, h); 

    StdDraw.line(0, 0, 0, h); 
    StdDraw.line(0, h, w, h); 
    StdDraw.line(w, h, w, 0); 
    StdDraw.line(w, 0, 0, 0); 

    draw(); 
} 

現在我只需要弄清楚如何隨機選擇這些線路的3,和每行隨機擦除一部分。

+0

不公平的改變問題;)雖然這是一個有趣的問題,它更容易幫助,如果你發佈一些源代碼解決該問題旋轉。 –

+0

*「我怎麼能隨機選擇每一行的地方」打開?「」*你似乎相信'隨意打開行'會產生一個有效的邏輯迷宮。我OTOH認爲它不會。這裏的第一個任務應該是弄清楚如何爲迷宮創建一個形狀。 –

+0

@NickRippe我已經添加了一些代碼。我知道這可能是非常簡單的代碼,但我只是從CS開始,所以這就是我正在使用的。 – yiwei

回答

1

假設您使用的是swingpaintComponent方法,您可以將Graphic的顏色設置爲背景顏色並再次在該線上繪製。這裏有一個例子:

public class DrawTest extends JPanel{ 
    public static void main(String[] args) 
    { 

     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new DrawTest()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public Dimension getPreferredSize(){ 
     return new Dimension(400,300); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.black); 
     g.drawLine(10, 10, 100, 10); 
     g.setColor(getBackground()); 
     g.drawLine(50, 10, 60, 10); 
    } 
} 

編輯

我想你是不是在paintComponent方法創建迷宮(或你最終與每次重新粉刷一次新的迷宮)。所以,我建議創建一個類似於下面的子類,並將它的實例存儲在主類的ArrayList字段中。然後當你氣喘吁吁時,你可以迭代你的ArrayList

public static class MazeWall{ 
    public static final int OpeningWidth = 10; 

    Point start; 
    Point end; 
    Point opening; 

    public MazeWall(Point start, Point end, boolean hasOpening){ 
     this.start = start; 
     this.end = end; 

     if(hasOpening){ 
      int range; 
      if(start.x == end.x){ 
       range = end.x - start.x - OpeningWidth; 
       int location = (int)(Math.random() * range + start.x); 
       opening = new Point(location, start.y); 
      } else{ 
       range = end.y - start.y - OpeningWidth; 
       int location = (int)(Math.random() * range + start.y); 
       opening = new Point(location, start.x); 
      } 
     } 
    } 
}