2D лабиринт решатель: окончательный лабиринт не будет печатать

Я работаю над программой, которая решит поиск пути в лабиринте. Лабиринт представлен 0, 1 и E для обозначения выхода. Лабиринт представлен 20x30 (0 представляют путь, 1 представляют стены). Я использую стек, чтобы отслеживать предыдущее полезное местоположение.

Я думаю, что у меня есть большая часть кода, но когда я запускаю его и вхожу в начальную позицию, последний лабиринт не распечатывается.

Мой код выглядит следующим образом:

import java.util.*;
import java.io.*;
public class MazeGenerator {

//main
 public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);
        int userRow, userCol;

        MazeGenerator maze = new MazeGenerator();
        maze.fillArray();
        maze.print();

        System.out.println();

        //asking for user starting position
        System.out.print("What row would you like to start in?: " );
        userRow = sc.nextInt();
        while(userRow > 29 || userRow < 0) {
            System.out.print("INVALID INPUT! PLEASE ENTER VALUES BETWEEN 0 - 
29 INCLUSIVE: " );
            userRow = sc.nextInt();
        }
        System.out.println();

        System.out.print("What column would you like to start in? ");
        userCol = sc.nextInt();
        while(userCol > 19 || userCol < 0) {
            System.out.print("INVALID INPUT! PLEASE ENTER VALUES BETWEEN 0 - 
19 INCLUSIVE: " );
            userCol= sc.nextInt();
        }


        System.out.println("\n\nFind a path using a stack: ");
        //maze.userStart(userRow,userCol);

        maze.setUserRow(userRow);
        maze.setUserColumn(userCol);


        maze.solveStack();
        //solveStack(maze);
 }

//methods for creating maze
public static final int ROW = 30;
public static final int COLUMN = 20;
public int userRow = 0;
public int userColumn = 0;
private static String[][] maze = new String[ROW][COLUMN];

public void fillArray() throws IOException {
    File file = new File("maze.txt");
    FileReader reader = new FileReader(file);
    BufferedReader buff = new BufferedReader(reader);

    for(int counter1 = 0; counter1 < ROW; counter1++) {

        String l = buff.readLine();

        for(int counter2 = 0; counter2 < COLUMN; counter2++) {

            maze[counter1][counter2] = String.valueOf(l.charAt(counter2));
        }
    }

    buff.close();
}

public void print() throws IOException {

    System.out.printf("%-4s", ""); //spaces column
    for (int counter = 0; counter < COLUMN; counter++){

         System.out.printf("%-4d",counter); //print the column number

    }
    System.out.println();

    for(int counter1 = 0; counter1 < maze.length; counter1++) { //loop for 
printing rows

        System.out.printf("%-4d",counter1); //print row number

        for(int counter2 = 0; counter2 < maze[counter1].length; counter2++) 
{ //loop for printing columns

            System.out.printf("%-4s", maze[counter1][counter2]); //printing 
values of maze
        }
        System.out.println(); // new line
    }
}

public int getWidth(){
    return maze[0].length;
}

public int getHeight(){
    return maze.length;
}


public void setUserRow (int userRow) {
    this.userRow = userRow;
}

public void setUserColumn (int userColumn) {
    this.userColumn = userColumn;
}

public int getUserRow() {
    return userRow;
}

public int getUserColumn() {
    return userColumn;
}

public String mark(int row, int col, String value) {
    assert(inMaze(row,col)); 
    String temp = maze[row][col];
    maze[row][col] = value;
    return temp;
    }

public String mark (MazePosition pos, String value) {
    return mark(pos.row(), pos.col(), value); 
}

public boolean isMarked(int row, int col) {
    assert(inMaze(row,col)); 
    return (maze[row][col].equals("+"));
}

public boolean isMarked(MazePosition pos) {
    return isMarked(pos.row(), pos.col());
}

public boolean Clear(int row, int col) {
    assert(inMaze(row,col)); 
    return (maze[row+1][col+1] != "1" && maze[row+1][col+1] != "+");
}

public boolean Clear(MazePosition pos) {
     return Clear(pos.row(), pos.col());
 }

//true if cell is within maze 
public boolean inMaze(int row, int col) {
    if (row >= 0 && col >= 0 && row < getWidth() && col < getHeight() ) {
        return true; 
    }
    return false;
}

//true if cell is within maze 
public boolean inMaze(MazePosition pos) {
    return inMaze(pos.row(), pos.col());
} 

public boolean Done( int row, int col) {
    return (maze[row][col].equals("E"));
}

public boolean Done(MazePosition pos) {
    return Done(pos.row(), pos.col());
}

public String[][] clone() {

    String[][] copy = new String[ROW][COLUMN]; 

    for (int counter1 = 0; counter1 < ROW; counter1++) {

        for (int counter2 = 0; counter2 < COLUMN; counter2++) {

            copy[counter1][counter2] = maze[counter1][counter2];
        }
    }
    return copy; 
    }

public void restore(String[][] savedMaze) {
    for (int i=0; i< ROW; i++) 
        for (int j=0; j<COLUMN; j++)
        maze[i][j] = savedMaze[i][j];
    }

public MazeGenerator clone(MazeGenerator m) {
    MazeGenerator maze = new MazeGenerator();
    maze = m;
    return maze;
}

//**************************************************
//this solution uses a stack to keep track of possible
//states/positions to explore; it marks the maze to remember the
//positions that it's already explored.
public void solveStack() throws IOException {

//save the maze
//MazeGenerator savedMaze = new MazeGenerator();
//savedMaze.clone(m);
String[][] savedMaze = clone();

//declare the locations stack 
Stack<MazePosition> candidates = new Stack<MazePosition>(); 

//insert the start 
candidates.push(new MazePosition(userRow,userColumn)); 

MazePosition current, next;
while (!candidates.empty()) {

    //get current position
    current = candidates.pop();

    if (Done(current)) { 
        break;
    }

    //mark the current position 
    mark(current, "+");

    //put its neighbors in the queue
    next = current.north(); 
    if (inMaze(next) && Clear(next)) candidates.push(next);

    next = current.east(); 
    if (inMaze(next) && Clear(next)) candidates.push(next);

    next = current.west(); 
    if (inMaze(next) && Clear(next)) candidates.push(next);

    next = current.south(); 
    if (inMaze(next) && Clear(next)) candidates.push(next);
}

if (!candidates.empty()) {
    System.out.println("You got it!");
}
else System.out.println("You're stuck in the maze!");

//savedMaze.print();
print();

restore(savedMaze);

}

class MazePosition {
    public int row; 
    public int col;

    public MazePosition(int row, int col) {
        this.row = row; 
        this.col = col;
    }

    public int row() { return row; }

    public int col() { return col; }

    public void print() {
        System.out.println("(" + row + "," + col + ")");
    }

    //positions
    public MazePosition north() {
        return new MazePosition(row-1, col);
    }

    public MazePosition south() {
        return new MazePosition(row+1, col);
    }

    public MazePosition east() {
        return new MazePosition(row, col+1);
    }

    public MazePosition west() {
        return new MazePosition(row, col-1);
    }
}; 

    }

1 ответ

Решение

Без использования файла maze.txt я создал его на основе вашего описания. Вот что я нашел...

Короткий ответ:

Ваша программа выполняет бесконечный цикл поиска выхода, поэтому она никогда не достигает кода для его распечатки.

Длинный ответ:

Я вижу 3 проблемы на 2 строки кода:

1) Простая опечатка:

if (row >= 0 && col >= 0 && row < getWidth() && col < getHeight() ) {

getHeight () и getWidth() должны поменяться местами:

if (row >= 0 && col >= 0 && row < getHeight() && col < getWidth() ) {

2) В одном месте вы используете индексы на основе 1, когда Java использует индексы на основе 0:

В этой строке здесь:

return (maze[row+1][col+1] != "1" && maze[row+1][col+1] != "+");

Индексы массивов в java начинаются с 0. Ваши переменные row и col также начинаются с 0. Но вы добавляете один к ним, тем самым преобразуя их в индексы на основе 1. Итак, вы хотите:

return (maze[row][col] != "1" && maze[row][col] != "+");

3) Вы используете!= Like! Equals(), но в Java == - это не то же самое, что.equals()

В приведенной выше строке кода вы сравниваете две строки с оператором!=. Но это не работает как метод String.equals(), поэтому ваш метод Clear() всегда возвращает true.

В этом суть вашей заявленной проблемы. Процедура поиска, обнаружив, что каждая ячейка свободна, проходит в угол, а затем постоянно ищет те же две соседние ячейки.

Итак, что вы действительно хотите:

return (!maze[row][col].equals("1") && !maze[row][col].equals("+"));
Другие вопросы по тегам