Выход из лабиринта со стрелками, Как исправить код? - PullRequest
0 голосов
/ 14 апреля 2019

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

Это код:

public static void main(String[] args) {
    final int NUMBER_OF_COLUMNS = 6;
    final int NUMBER_OF_ROWS    = 5;

    boolean entryFound  = false;
    boolean exitFound   = false;
    boolean work        = true;
    int     entryIndex  = -1;
    int     exitIndex   = -1;
    int     row         = -1;
    int     column      = -1;

    char[][] pathMatrix = { 
                            { 'O', 'V', 'O', '^', '<', '<' }, 
                            { 'O', 'V', 'V', '*', '^', '^' },
                            { '*', 'V', '*', 'O', '*', '^' },
                            { 'O', 'V', 'O', 'O', 'V', '^' },
                            { 'O', '>', '>', '>', '>', '^' },  };

    for(column = 0; column < NUMBER_OF_COLUMNS; column++){
        if(pathMatrix[0][column] == 'V'){
            entryFound = true;
            entryIndex = column;
        }
        if(pathMatrix[NUMBER_OF_ROWS -1][column] == 'V'){
            System.out.println(NUMBER_OF_ROWS -1 + " " + column);
            exitFound = true;
            exitIndex = column;
        }

        if(pathMatrix[0][column] == '^'){
            exitFound = true;
            exitIndex = column;
        }

        if(pathMatrix[0][column] == '>'){
            exitFound = true;
            exitIndex = column;
        }

    }
    System.out.println(exitIndex);


    for(row = 0; row < NUMBER_OF_ROWS; row++){
        for(column = 0; column < NUMBER_OF_COLUMNS; column++){
            System.out.print(pathMatrix[row][column] + " ");
        }
        System.out.print('\n');
    }

    if(entryFound == false || exitFound == false){
        System.out.println("No path has been found in the matrix above");

        return;
    }
    row = 0;
    column = entryIndex;

    do
    {
        System.out.println(row+" "+column);

        if(pathMatrix[row][column] == 'V'){
            row++;
        }

        else if(pathMatrix[row][column] == '>'){
            column++;
        }
        else if(pathMatrix[row][column] == '<'){
            column--;
        }
        else if(pathMatrix[row][column] == '^'){
            row--;
        }
        else {
            work = false;
        }

    }
    while(work == true && (0 < row && row < NUMBER_OF_ROWS) && (0 < column && column < NUMBER_OF_COLUMNS));

    if(row == NUMBER_OF_ROWS && column == exitIndex){
        System.out.println("The path has been found in the maze above");
    }
    else{
        System.out.println("No path has been found in the maze above");
    }
}

и это маршрут: (выйти из 0,4, но он не работает)

O V O ^ < < 
O V V * ^ ^ 
* V * O * ^ 
O V O O V ^ 
O > > > > ^ 
0 1
1 1
2 1
3 1
4 1
4 2
4 3
4 4
4 5
3 5
2 5
1 5
No path has been found in the maze above

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

проблема

В вашем коде 2 ошибки:

1 - условие в вашем цикле говорит:

while(work == true && (0 < row && row < NUMBER_OF_ROWS) && (0 < column && column < NUMBER_OF_COLUMNS));

0 < row неверно, это означает, что вы не можете запустить первую строку с индексом 0. Но вы хотите иметь возможность это сделать, поэтому на самом деле вам нужно написать 0 <= row. Так что исправьте это так:

while(work && (0 <= row && row < NUMBER_OF_ROWS) && (0 <= column && column < NUMBER_OF_COLUMNS));

2 - условие для проверки, если вы нашли выход

if(row == NUMBER_OF_ROWS && column == exitIndex)

здесь вы проверяете, что вы вышли из нижнего ряда, вы хотите проверить, вышли ли вы из верхнего ряда, то есть строка равна -1. Поэтому перепишите это так:

if(row < 0 && column == exitIndex)

примечание

Я думаю, вы бы значительно улучшили читабельность, и было бы намного проще протестировать, если бы вы разбили свой код на методы. Вот пример:

private static final char[][] pathMatrix = {
        { 'O', 'V', 'O', '^', '<', '<' },
        { 'O', 'V', 'V', '*', '^', '^' },
        { '*', 'V', '*', 'O', '*', '^' },
        { 'O', 'V', 'O', 'O', 'V', '^' },
        { 'O', '>', '>', '>', '>', '^' },  };

private static final int NUMBER_OF_COLUMNS = 6;
private static final int NUMBER_OF_ROWS    = 5;

public static void main(String[] args) {

    printMatrix();

    int[] currentPosition = findEntrance();

    System.out.println("Entrance: " + currentPosition[0] + " " +currentPosition[1] + " " + pathMatrix[currentPosition[0]][currentPosition[1]]);

    while(isInsideMatrix(currentPosition) && isArrow(currentPosition)) {
        System.out.println(currentPosition[0] + " " + currentPosition[1] + " " + pathMatrix[currentPosition[0]][currentPosition[1]]);
        currentPosition = move(currentPosition);
    }

    if(isInsideMatrix(currentPosition)) {
        System.out.println("No path has been found in the maze above");
    } else {
        System.out.println("The path has been found in the maze above");
    }
}

Находит вход в лабиринт. Возвращает позицию как int [] в форме {rowIndex, colIndex}

private static int[] findEntrance() {
    char c;

    // scan first and last rows
    for(int column = 0; column < NUMBER_OF_COLUMNS; column++) {
        // first row
        c = pathMatrix[0][column];
        if(c == 'V') {
            return new int[] {0, column};
        }
        // last row
        c = pathMatrix[NUMBER_OF_ROWS-1][column];
        if(c == '^') {
            return new int[] {NUMBER_OF_ROWS-1, column};
        }
    }

    // scan first and last columns
    for(int row = 0; row < NUMBER_OF_ROWS; row++) {
        // first column
        c = pathMatrix[row][0];
        if(c == '>') {
            return new int[] {row, 0};
        }
        // last row
        c = pathMatrix[row][NUMBER_OF_COLUMNS-1];
        if(c == '<') {
            return new int[] {row, NUMBER_OF_COLUMNS-1};
        }
    }

    return null;
}

Перемещает курсор и возвращает следующую позицию. Предполагая, что мы сейчас стоим на стрелке

private static int[] move(int[] position) {
    int row = position[0];
    int col = position[1];
    char charAtPosition = pathMatrix[position[0]][position[1]];

    int[] newPosition;
    if(charAtPosition == 'V') {
        newPosition = new int[] {row+1, col};
    } else if(charAtPosition == '^') {
        newPosition = new int[] {row-1, col};
    } else if(charAtPosition == '>') {
        newPosition = new int[] {row, col+1};
    } else if(charAtPosition == '<') {
        newPosition = new int[] {row, col-1};
    } else {
        throw new RuntimeException("Should never come in here.");
    }
    return newPosition;
}

Проверяет, есть ли стрелка в заданной позиции

private static boolean isArrow(int[] position) {
    int row = position[0];
    int col = position[1];
    char charAtPosition = pathMatrix[row][col];
    return charAtPosition == 'V' || charAtPosition == '^' 
        || charAtPosition == '<' || charAtPosition == '>';
}

Проверяет, находится ли заданная позиция внутри матрицы

private static boolean isInsideMatrix(int[] position) {
    int row = position[0];
    int col = position[1];
    return row >= 0 && row < NUMBER_OF_ROWS
        && col >= 0 && col < NUMBER_OF_COLUMNS;
}

Печать матрицы

private static void printMatrix() {
    for(int row = 0; row < NUMBER_OF_ROWS; row++){
        for(int column = 0; column < NUMBER_OF_COLUMNS; column++){
            System.out.print(pathMatrix[row][column] + " ");
        }
        System.out.print('\n');
    }
}

Это выводит:

O V O ^ < <
O V V * ^ ^
* V * O * ^
O V O O V ^
O > > > > ^
Entrance: 0 1 V
0 1 V
1 1 V
2 1 V
3 1 V
4 1 >
4 2 >
4 3 >
4 4 >
4 5 ^
3 5 ^
2 5 ^
1 5 ^
0 5 <
0 4 <
0 3 ^
The path has been found in the maze above
0 голосов
/ 14 апреля 2019

Как уже сказал кто-то другой, попробуйте отладчик или операторы print, чтобы проверить, какие значения вы ожидаете, что ваши переменные будут хранить в разных точках выполнения, и какие есть реальные значения.Мне кажется, что row==NUMBER_OF_ROWS не то, что вы хотите проверить в финале, если.В вашем примере вы должны быть в первом ряду, чтобы выйти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...