Исключение «За пределами границ» — лабиринт 2D-массива

Я новичок здесь и новичок в кодировании в целом! Учиться интересно, но как всегда утомительно. Я пишу программу, в которой персонажу нужно решить лабиринт. Я еще не закончил здесь, но по какой-то причине я получаю исключение за пределы для любого массива, длина которого превышает 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;
    }
}

person user2120955    schedule 01.03.2013    source источник
comment
Привет, добро пожаловать в StackOverflow! Не могли бы вы указать нам на строку, где вы получаете исключение индекса за пределами границ? Не номер, а содержимое строки для справки. Вы, возможно, захотите рассмотреть SSCCE: sscce.org.   -  person Ryan Amos    schedule 01.03.2013


Ответы (1)


Вы переводите одномерный массив String в двумерный массив boolean, но размер целевого массива неправильный. Количество строк и столбцов различается, поэтому имеет значение размер 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;
person Reimeus    schedule 01.03.2013
comment
Большое спасибо! Я на самом деле только что понял это самостоятельно. Проблема заключалась в том, что мой инструктор сказал мне поменять их местами, что меня чертовски запутало. В любом случае, большое спасибо! Теперь, когда я прошел это, я могу попытаться выяснить, как заставить этого персонажа перемещаться по лабиринту! - person user2120955; 01.03.2013
comment
Рассматривайте одномерный массив String как двумерный массив. Используйте индекс массива и String#charAt в качестве индексов/координатов i и j. Отслеживайте текущие координаты этих строк и столбцов, добавляя проверку стен. Удачи! - person Reimeus; 02.03.2013