2

つまり、基本的に私がやろうとしているのは、左側のルールを使用して迷路を解くアルゴリズムを作成することですが、私は合格できないように見える問題に直面しています。

最初の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

Try the following. This should check if there is a wall on the left, and go forward 1 if there is. If there is no wall on the left, it will turn left 90 degrees and move forward 1.

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

「左の壁」がカメが向いている場所に関連する答えを与えるので、あなたは混乱しています。

現在のアルゴリズムでは...

  • 左側に壁がある場合は、前方に歩きます。
  • 次に、左側に壁がある場合は、左に90度回転します。
  • (この時点で、壁に面します。)
  • 次に、目の前に壁があるので、右に90度曲がります。
  • 次に、目の前に壁がある場合は、前方に歩きます。
  • 永遠に繰り返します。

左に壁があるので左に曲がるとすぐに右に曲がります。壁が目の前にあるからです。

于 2012-11-07T21:47:10.337 に答える
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 に答える
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 に答える