2d迷宫如何不进入墙壁或超出界限?

时间:2016-11-11 06:00:49

标签: java

嗨我已经制作了我的代码,但我遇到的唯一问题是当有墙或出界时不要移动。我理解这样做的难点是编码类似

if (CHARACTER == line [2][0] && (dir.equalsIgnoreCase("l")) {}

"l"被遗弃)这样当玩家想要离开时,它不会在那个特定的位置移动,因为有一堵墙,但是我必须在所有情况下这样做,它看起来很漂亮乏味。有关如何做到这一点的任何帮助?谢谢。

如果有帮助的话,这是它的一部分:

private final static char CHARACTER = 'X';
private final static char BLANK = '.';
private final static char GOAL = 'O';
private final static char WALL = 'W';

private final static int SIZE = 4;

public static void main(String[] args) {

    char[][] line = new char[SIZE][SIZE];

    for(int i = 0; i < line.length; i++) 
    {
        for(int j = 0; j < line[i].length; j++) 
        {
            line[i][j] = BLANK;
        }
    }

    line[2][0] = CHARACTER;
    line[0][0] = GOAL;
    line[1][0] = WALL;
    line[1][1] = WALL;
    line[1][3] = WALL;
    line[2][1] = WALL;
    line[2][3] = WALL;
    int xPos = 2;
    int yPos = 0;
}               

2 个答案:

答案 0 :(得分:2)

您可以使用索引来检查您是否超出范围或是否有墙。我建议这样的事情(注意:这只适用于Java 7或更高版本)

// I assume your board is always square because of new char[SIZE][SIZE]
private static boolean isOutOfBounds(int coord) {
    return coord < 0 || coord >= SIZE;
}

/**
 * Checks, if the given coordinate is inside bounds and is not a wall.
 */
private static boolean isValid(int x, int y) {
    return !isOutOfBounds(x) &&
           !isOutOfBounds(y) &&
           line[x][y] != WALL;
}

// I assume you have directions "u", "r", "d", "l"
public static boolean canGoDirection(String direction, int currX, int currY) {
    switch(direction) {
        case "u": return isValid(currX, currY - 1);
        case "r": return isValid(currX + 1, currY);
        case "d": return isValid(currX, currY + 1);
        case "l": return isValid(currX - 1, currY);
        default: throw new IllegalArgumentException(direction + " is not a valid direction.");
    }
}

现在,您可以将canGoDirection()与当前坐标和所需方向一起使用。如果它返回true,您可以按照这种方式更新新职位。

答案 1 :(得分:0)

我从你的问题中理解,如果下一个位置是墙,你的玩家不应该移动。假设玩家的起始位置不是墙。

我认为你必须有一些方法来跟踪球员的当前位置。在游戏的主循环中保持这两个索引更新。检查下一个位置的数组值(如果它是墙壁,而不是不移动)(不要更新索引)。如果没有,则移动并更新用户当前位置的索引。