1

私は Maze ソルバー アルゴリズムで作業していますが、行き止まりになり、このようにループに陥るまで、すべてが正常に機能しています。問題は、向きを変えたいときに十分なスペースがなく、正面の壁に面しているため、代わりに別の向きを変えて無限ループに陥ることのようです。

ここに私が取り組んでいる 2 つのコードがありますが、最初のコードが最も関連性の高いものです。

SimpleWindowは、すべてが描画されるメイン ウィンドウなどです。クラスは、迷路とmaze値(これらはすべてブール値)を生成するファイルです。wallAtLeftwallInFrontatExit

import se.lth.cs.ptdc.window.SimpleWindow;
import se.lth.cs.ptdc.maze.*;

public class MazeTurtle extends Turtle {
protected int Maze;

public MazeTurtle(SimpleWindow w, int x, int y) {
    super(w, x, y);
}

public void walk(Maze maze) {
    Maze m = new Maze(4);
    Turtle t = new Turtle(w, m.getXEntry(), m.getYEntry());
    int x1 = m.getXEntry();
    int y1 = m.getYEntry();
    int dir = t.getDirection();
    t.penDown();

    while ((m.atExit(x1, y1)) == false) {
        if (m.wallAtLeft(dir, x1, y1) == true) {
            t.forward(1);
            SimpleWindow.delay(10);
        }

        else if (m.wallAtLeft(dir, x1, y1) == false) {
            t.left(90);
            t.forward(1);
            SimpleWindow.delay(10);
        }

        if (m.wallInFront(dir, x1, y1) == true) {
            t.left(-90);
            t.forward(1);
            SimpleWindow.delay(10);
        }

        x1 = t.getX();
        y1 = t.getY();
        dir = t.getDirection();
        System.out.println("X: " + x1 + "Y: " + y1);
    }

}

}

すべてを描画するプログラムは次のとおりです。

import se.lth.cs.ptdc.window.SimpleWindow;
import se.lth.cs.ptdc.maze.*;

public class MazeTest {

public static void main(String args[]) {

    Maze m = new Maze(4);
    SimpleWindow w = new SimpleWindow(600, 600, "MazeTest");
    MazeTurtle t = new MazeTurtle(w, m.getXEntry(), m.getYEntry());
    t.penDown();
    m.draw(w);
    t.walk(m);
}

}

必要に応じて説明付きの迷路クラス。これには一部のメソッドのみが必要であることに注意してください。http://pastebin.com/gxSeEc2U

これは私が使用しているタートル クラスです: http://pastebin.com/0RqbVudn

4

2 に答える 2

1

向きを変えるとまた壁があるかもしれないので、t.forward(1);下のセクションではコールしないほうがいいと思います。

    if (m.wallInFront(dir, x1, y1) == true) {
        t.left(-90);
        //t.forward(1);
        SimpleWindow.delay(10);
    }

一歩移動しようとすると想定しているだけforward(1)で、スペースがない場合(前の壁)に問題が発生する可能性があります

于 2012-11-08T17:59:43.250 に答える
1

使用する代わりに

if (m.wallInFront(dir, x1, y1) == true) {
        t.left(-90);
        SimpleWindow.delay(10);

これを次のように置き換えました。

if (m.wallInFront(dir, x1, y1) && m.wallAtLeft(dir, x1, y1) == true) {
            t.left(-90);
            SimpleWindow.delay(10);
        }

今度は、一度に 1 つのことをチェックする代わりに、壁だけでなくコーナーがあるかどうかをチェックします。

途中で助けてくれてありがとう:)

于 2012-11-08T19:02:52.013 に答える