Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迷宫解算器循环问题java_Java_Maze - Fatal编程技术网

迷宫解算器循环问题java

迷宫解算器循环问题java,java,maze,Java,Maze,所以基本上我要做的是用左手法则创建一个迷宫求解算法,但我遇到了一个我似乎无法通过的问题 前两个代码是我正在使用的代码,我遇到的问题是,当我尝试循环if语句时,它只是继续向上绘制一条直线,而不是向左(在本例中)旋转,然后循环回到开始并绘制一条直线,直到它再次碰到墙。请注意,我知道这不是成品,我只是想确保第一个左转和环路正常工作 import se.lth.cs.ptdc.window.SimpleWindow; import se.lth.cs.ptdc.maze.*; public class

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

前两个代码是我正在使用的代码,我遇到的问题是,当我尝试循环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);
}

}
这是我参考的迷宫课程:

还有我正在使用的海龟类:

尝试以下方法。这应该检查左侧是否有墙,如果有,则前进1。如果左侧没有墙,它将向左旋转90度并向前移动1

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

我对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);
        }
}

for(inti=0;i你会感到困惑,因为“左边的墙”给出了海龟所面对的相对位置的答案

使用您当前的算法

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

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

我很确定现在应该可以解决这个问题了

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);
        }

目前,while循环就是这样的:这只是给他画了一条直线,他想使用左手法则,所以他应该在直线转弯时转弯。遗憾的是,它仍然会做同样的事情。如果我删除“while”语句,它只会前进1px,然后停止。但是如果我按照我在代码中所做的相同方式来做,并删除“while”语句有效。没有“while”语句的结果:(我选择了10而不是1px,这样它会注意到更多)这给出了与我相同的结果。好吧,我真的没有“wallAtBottom”或“wallAtRight”供我处理。我猜现在我终于得到了你想要做的;)仍然做同样的事情:/你可以很容易地添加
wallAtRight
你自己,只要右转看看前面是否有墙(不要忘记恢复前面的方向):
t.left(-90);if(m.wallnfort(…){t.left(90);返回true;}否则{t.left(90);返回false;}
。谢谢!它成功了:)。我实际上正在研究一个类似的解决方案。
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);
        }