2

所以基本上我想做的是用左手规则创建一个迷宫求解算法,但我遇到了一个我似乎无法通过的问题。

前两个代码是我正在使用的代码,我遇到的问题是,当我尝试循环 if 语句时,它只是继续画一条直线而不是左转(在这种情况下)然后循环回到起点并画一条线,直到它再次撞到墙上。请注意,我知道这不是成品,我只是想确保第一个左转并且循环正常工作。

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(1);
    Turtle t = new Turtle(w, m.getXEntry(), m.getYEntry());
    t.penDown();


    while(true){
        if(m.wallAtLeft(getDirection(), getX(), getY())){
            t.forward(1);
        }

        if(m.wallAtLeft(getDirection(), getX(), getY())){

            t.left(90);
        }


            /** The "wallInFront" could be ignored for now */
        if(m.wallInFront(getDirection(), getX(), getY())) {

            t.left(-90);
        }
        if(m.wallInFront(getDirection(), getX(), getY())){
            t.forward(1);
        }

         SimpleWindow.delay(10);
    }
}
}

这是尝试使用给定算法解决迷宫的“测试”:

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(1);
    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

5 回答 5

1

我很确定现在应该可以解决了

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);
        }
于 2012-11-08T17:10:45.803 回答
0

你很困惑,因为“左边的墙”给出了相对于乌龟所面对的位置的答案。

使用您当前的算法....

  • 如果左边有墙,你就往前走。
  • 然后,如果左边有墙,向左转 90 度。
  • (此时您将面对墙壁。)
  • 然后,因为你面前有一堵墙,你会向右转90度。
  • 然后,如果你面前有一堵墙,你就会向前走。
  • 永远重复。

每当你因为左边有一堵墙而左转时,你会立即右转,因为现在墙就在你面前。

于 2012-11-07T21:47:10.337 回答
0
    while (true) {
        if (m.wallAtLeft(getDirection(), getX(), getY())) {
            if (m.wallInFront(getDirection(), getX(), getY())) {
                t.left(-90);
            } else {
                t.forward(1);
                SimpleWindow.delay(10);
            }
        } else {
            t.left(90);
            t.forward(1);
            SimpleWindow.delay(10);
        }
    }
于 2012-11-07T21:02:27.707 回答
0

试试下面的。这应该检查左侧是否有墙,如果有则前进1。如果左边没有墙,它会左转 90 度并向前移动 1。

if(m.wallAtLeft(getDirection(), getX(), getY())){
    t.forward(1);
} else {
    t.left(90);
    t.forward(1);
}
于 2012-11-07T19:54:57.433 回答
0

我对Java相当陌生,但我会尝试这样的事情

for (int i=0; i<500; i++) {
        SimpleWindow.delay(10);

        if (m.wallInFront(getDirection(), getX(), getY()) == false) {
            t.forward(1);   
        }

        if (m.wallInFront(getDirection(), getX(), getY()) == true) {
            t.left(90);
        }
}

为了不撞墙

于 2012-11-07T20:24:38.573 回答