0

私はここで新しく、コーディング全般に慣れていません!学ぶことはエキサイティングですが、相変わらず退屈です。私はcharが迷路を解く必要があるプログラムを書いています。私はここで終わりに近づいていませんが、何らかの理由で、長さが3を超える配列で範囲外の例外が発生しています。理由はわかりません。テストケースがあり、小さな迷路が正常に印刷されるのを見ることができますが、大きな迷路を試してみると、範囲外の例外が発生します。

何かアドバイス?

import java.awt.Point;


public class Maze 
{
    final char WALL = 'x';
    final char BOT = 'r';
    final char FREE = ' ';

    private String[] maze;
    private Point position;
    private boolean[][] mazeWalls;

    public Maze(String[] strings) // constructor to create maze from main as a 2D array
    {
        maze = strings;
        mazeWalls = new boolean[strings[0].length()][strings.length];
            for (int i = 0; i < mazeWalls.length; i++)
                for (int j = 0; j < mazeWalls[0].length; j++)
                {
                    if (strings[i].charAt(j) == WALL) // this is where it shows the out of bounds error on m[3] or m[4]
                        mazeWalls[j][i] = true;

                    else if (strings[i].charAt(j) == BOT)
                    {
                        position = new Point(i, j);
                    }
                }
    }

    public static void main (String[] args)
    {
        Maze m;
        /*m = new Maze(new String[] {
                "xxx",
                "xrx",
                "xxx"});
        m = new Maze(new String[] {
                "xxx",
                "xrx",
                "x x"});
        m = new Maze(new String[] {
                "xxx",
                "xr      ",
                "xxx",});*/
        m = new Maze(new String[] {
                "xxxxx",
                "xr  x",
                "x   x",
                "x    ",
                "x   x",
                "x   x",
                "xxxxx"});
        /*m = new Maze(new String[] {
        "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "xr  r                 x                     x",
        "x                    x                     x",
        "x   x                x                      ",
        "x   x                x                     x",
        "x   x                x                     x",
        "x   x                x                     x",
        "x   xxxxxxxxxxxxxxxxxxxxxxxxxx             x",
        "x   x                                      x",
        "x   x                                      x",
        "x   x                                      x",
        "x   x                                      x",
        "x   x                                      x",
        "x   x                                      x",
        "x   x                                      x",
        "x   xxxxxxxxxxxxxx  xxxxxxxxxxxxxxxxxxxxxxxx",
        "x   x                                      x",
        "x   x                                      x",
        "x   x                                      x",
        "x                                          x",
        "x                                          x",
        "x                                          x",
        "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});*/
                Robot r = new RandomBot();
            //  Robot r = new RightHandBot();

                int c = 0;
                System.out.println(m);
                while (!m.isRobotOnEdge())
                {
                    c++;
                    Point move = r.getMove(m);
                    m.moveTo(move);
                    System.out.println("Step Count: " + c);
                    System.out.println(m);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {}
                }   
    }

    public void moveTo(Point p) 
    {
        /*for (int i = 0; i < mazeWalls.length; i++)
            for (int j = 0; j < mazeWalls[0].length; j++)
            {
                if (maze[i].charAt(j) == BOT)
                    position = p;
            }*/
    }

    public Point getPoint()
    {
        return (Point)position.clone();
    }

    public boolean wallObject(Point p)
    {
        return wallHere(position.x, position.y);
    }

    public boolean wallHere(int x, int y)
    {
        return x < 0 || x >= mazeWalls.length || y < 0 || y >= mazeWalls[0].length || mazeWalls[x][y];
    }

    public boolean isRobotOnEdge() 
    {
                if (position.x == mazeWalls.length - 1 || position.y == mazeWalls[0].length - 1 || position.x == 0 || position.y == 0)
                    return true;
        return false;
    }

    public String toString()
    {
        String s = "";
            for (int j = 0; j < mazeWalls.length; j++)
            {
                for (int i = 0; i < mazeWalls[0].length; i++)
                {
                    if (i == position.x && j == position.y)
                        s += BOT;
                    else if (mazeWalls[i][j] == true)
                        s += WALL;
                    else
                        s += FREE;
                }
             s += "\n";
            }

        return s;
    }
}
4

1 に答える 1

0

1DString配列を 2Dboolean配列に変換していますが、ターゲット配列のサイズが間違っています。行数と列数が異なるため、2D 配列のサイズが重要です。これを見てください:

                            ROWS                COLUMNS
mazeWalls = new boolean[strings[0].length()][strings.length];

そのはず

mazeWalls = new boolean[strings.length][strings[0].length()];

また、値を転置しようとしている場合を除き、この行

mazeWalls[j][i] = true;

する必要があります

mazeWalls[i][j] = true;
于 2013-03-01T01:19:03.557 に答える