0

私は迷路を作っています。ここで定義されている再帰的な方法を使用したいと思います。ただし、ランダムに線を引いた後、ランダムに線を開く方法については、助けが必要です。今は、始点と終点のx座標とy座標で線(迷路の壁)を描くだけで線(迷路の壁)を作成しています。線の一部を「消去」(または「開く」)する簡単な方法が見つからないようです。

編集:さて、もう少し具体的にする必要があります。各行の場所をランダムに選択して「開く」にはどうすればよいですか?

編集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つをランダムに選択し、各行についてランダムに一部を消去する方法を理解する必要があります。

4

1 に答える 1

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);
            }
        }   
    }
}
于 2012-10-17T18:31:31.553 に答える