1

我正在使用迷宫求解器算法,一切正常,直到它遇到死胡同并陷入循环,就像这样。问题似乎是,当它想转身时,那里没有足够的空间容纳它,所以它会再次转身,因为它面对前面的墙壁,因此陷入了无限循环。

这是我正在使用的两个代码,但第一个是最相关的。

SimpleWindow是绘制所有内容等的主窗口,类是生成迷宫和值的文件,maze例如wallAtLeft,,(这些都是布尔值)wallInFrontatExit

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/gxSecEc2U

这是我正在使用的海龟类: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);
        }

现在,它不是一次检查一件事,而是检查是否有 CORNER,而不仅仅是一堵墙。

谢谢大家一路上的帮助:)

于 2012-11-08T19:02:52.013 回答