Программа не распознает, где символы находятся в массиве - PullRequest
0 голосов
/ 10 января 2019

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

x       |               \   
        /       /           \
                \           
    /       /           \   
\       \       |       |   

Символ х обозначает игрока, и каждую секунду он перемещается на одну позицию дальше вправо. Если он вступает в контакт с «/», он перемещается на один пробел вправо и на один пробел вниз. Если он вступает в контакт с «\», он перемещается на одну позицию вправо и на одну позицию вверх. И если он вступает в контакт с «|», он автоматически умирает. Тем не менее, программа, похоже, не распознает, когда на пути игрока есть препятствие. Он просто все время движется прямо и в конце выглядит так:

x   x   x   x   x   x   x   x
        /       /           \
                \           
    /       /           \   
\       \       |       |   

Вот мой код, который должен проверять наличие препятствий:

        if (maze[l][f].equals("/")) {
            if ((l-1) < 0) {
                System.out.println("You died on column " + (f + 1));
                System.exit(0);
                y+=1;
            } else {
                l-=1;
                f+=1;
                maze[l][f] = "x";
                y+=1;
            }
        } else if (maze[l][f].equals("\\")) {
            if ((l+1) >= rows){
                System.out.println("You died on column " + (f + 1));
                System.exit(0);
                y+=1;
            } else {
                l+=1;
                f+=1;
                maze[l][f] = "x";
                y+=1;
            }
        } else if (maze[l][f].equals("|")) {
            System.out.println("You died on column" + (f+1));
            System.exit(0);
            y+=1;
        } else {
            f+=1;
            maze[l][f] = "x";
            y+=1;
        }

А вот код, который создает лабиринт:

private static int rows;
private static int columns;
public static String[][] maze = new String[5][8];
public String[][] grid() {  
    Random rand = new Random();
    int prob;
    String obstacle = "";
    boolean enabled = true;
    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < columns; c++) {
            if (enabled == true) {
                prob = rand.nextInt(9) + 1;
                if (prob == 1) {obstacle = "|"; enabled = false;}
                else if (prob == 2 || prob == 3) {obstacle = "/"; enabled = false;}
                else if (prob == 4 || prob == 5) {obstacle = "\\"; enabled = false;}
                else {obstacle = ""; enabled = true;}
            }
            else {enabled = true; obstacle = "";}
            maze[r][c] = obstacle;
        }
    }
    return maze;
}

Я не вижу, что с этим не так. Если у вас есть идеи, дайте мне знать.

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Допустим, вы находитесь в позиции [0,0] с сеткой, которую вы написали в вопросе: Вы получили l=0; f=0 Позиция является пробелом, код выполняется и достигает последней else части.

Теперь, что происходит? f увеличивается, это означает, что вы двигаетесь вправо и теперь стоите [0,1]. А затем вы отмечаете свою позицию, написав x на этой новой позиции.

При следующем выполнении символ не является пробелом, как вы ожидаете, а x. Вы снова добираетесь до блока else и снова двигаетесь вправо к [0,2]. Опять же, вы отмечаете свою новую позицию x, перезаписывая |, который стоял там. И так далее ...

Что вы должны сделать: пометить свою позицию, только если символ не является специальным символом, и перед перемещением на следующую позицию

    if (maze[l][f].equals("/")) {
        if ((l+1) >= rows) {
            System.out.println("You died on column " + (f + 1));
            System.exit(0);
            y+=1;
        } else {
            //maze[l][f] = "x"; // only if you want to replace the '/' char
            l+=1; // to go down, add one (first line has index 0)
            f+=1;
            y+=1;
        }
    } else if (maze[l][f].equals("\\")) {
        if ((l-1) < 0){
            System.out.println("You died on column " + (f + 1));
            System.exit(0);
            y+=1;
        } else {
            maze[l][f] = "x"; // only if you want to replace the '\' char
            l-=1; // to go up, substractone (first line has index 0)
            f+=1;
            y+=1;
        }
    } else if (maze[l][f].equals("|")) {
        System.out.println("You died on column" + (f+1));
        System.exit(0);
        y+=1;
    } else {
        maze[l][f] = "x"; // mark the current position before moving to the next one
        f+=1;
        y+=1;
    }
0 голосов
/ 10 января 2019

Вы меняете текущую позицию на «x» после изменения переменных l и f.

, поэтому текущая позиция всегда оказывается «х», и персонаж продолжает двигаться вправо.

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