我正在使用迷宫求解器算法,一切正常,直到遇到死胡同并陷入循环,like this。问题似乎是当它想要转动那里没有足够的空间时,所以相反它又转了一圈,因为它面向前面的墙,因此卡在无限循环中。
以下是我正在使用的两个代码,但第一个是最相关的代码。
SimpleWindow
是绘制所有内容的主窗口等,maze
类是生成迷宫和值的文件,例如wallAtLeft
,wallInFront
,{ {1}}(这些都是布尔值)
atExit
以下是绘制所有内容的程序:
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);
}
}
}
迷宫类,如果需要,可提供描述。请注意,这只需要一些方法。 http://pastebin.com/gxSeEc2U
这是我正在使用的海龟类:http://pastebin.com/0RqbVudn
答案 0 :(得分:2)
我认为你不应该在下面的部分中调用t.forward(1);
,因为在改变方向后可能会再次出现一堵墙。
if (m.wallInFront(dir, x1, y1) == true) {
t.left(-90);
//t.forward(1);
SimpleWindow.delay(10);
}
我只是假设forward(1)
尝试移动一步,如果没有空间(前面的墙)可能会导致问题
答案 1 :(得分: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);
}
现在,它不是一次检查一件事,而是检查是否有一个角落,而不仅仅是一堵墙。
谢谢大家的帮助:)