首页 > 解决方案 > 程序无法识别字符在数组中的位置

问题描述

我正在尝试编写一个程序,其中角色在二维数组中移动,并且在与之交互的方式上存在某些障碍。迷宫看起来像这样(尽管每次运行时障碍物的位置都会改变):

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

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;
}

我看不出它有什么问题。如果您有任何想法,请告诉我。

谢谢

标签: javaarrayseclipse

解决方案


假设您当前位于位置 [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;
    }

推荐阅读