2D阵列检查环境

时间:2018-11-29 15:30:13

标签: java arrays

我有一个2D阵列,可以用作游戏板,用户可以将其移动到某些单元格等中,并且每个用户都有特定的ID,例如播放器1用其playerId = 1替换数组中的单元格。

我正在尝试创建一种方法来找出用户的playerId卡住的时间。当它们被另一个不为0的值包围时,它们会卡住。

例如,如果玩家1在单元格2,5中,则P(代表0)是他们可以进行的动作。但是,如果玩家被其他值包围,则他们应该不能移动(返回false)。

xxxPPPxxxx
xxxP1Pxxxx
xxxPPPxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

方法:

public boolean checkBlocked(int[][] array,List<Coordinates> track,int playerId)
{
    boolean blocked = false;
    int trueCount = 0;
    for (Coordinates cells: track)
    {
        int x = cells.getX();
        int y = cells.getY();
        if(array[x-1][y-1] == 0 ) trueCount++; //topleft
        if(array[x-1][y] == 0) trueCount++; //top
        if(array[x-1][y+1] == 0) trueCount++;//topright
        if(array[x][y+1] == 0) trueCount++;//right
        if(array[x][y-1] == 0) trueCount++;//left
        if(array[x+1][y-1] == 0) trueCount++;//bottomleft
        if(array[x+1][y] == 0) trueCount++;//bottom
        if(array[x+1][y+1] == 0) trueCount++; //bottomright
    }

    if (trueCount == 0)
    {
        blocked = true;
    }
    return blocked;
}

我尝试执行此方法,但是由于2D数组为6x10,然后如果单元格为1,1或6,1,则给出ArrayIndexOutOfBoundsException

是否有一种更简便的方法可以执行此检查或解决异常的方法?

2 个答案:

答案 0 :(得分:0)

三种解决方案

  • 使阵列在各个方向上都更大(并使壁不可见/不可穿透)-这具有最高的性能,是我最喜欢的图像处理技巧。
  • 采用类似wannabe的方法为您进行边界检查,并为出界坐标返回一个特殊值(或“壁”值)-这具有最佳的“代码可读性”
  • 在访问数组的任何地方都进行手动大范围检查-不推荐

答案 1 :(得分:0)

您必须检查板上是否有环绕声单元。为此,您可以向所有if添加其他检查。例如:

if(x > 0 && y > 0 && array[x-1][y-1] == 0) trueCount++;
if(x > 0 && array[x-1][y] == 0) trueCount++;
if(x > 0 && y < array[x-1].length - 1 && array[x-1][y+1] == 0) trueCount++;

我认为,最好使用内部检查创建单独的方法:

private static int get(int[][] array, int row, int col) {
    return row < 0 || row >= arr.length || col < 0 || col >= array[row].length ? 0 : array[row][col];
}

并将其保存在您的if中:

if(get(array, x-1, y-1) == 0) trueCount++;
if(get(array, x-1, y) == 0) trueCount++;
if(get(array, x-1, y+1) == 0) trueCount++;

最后,我认为将Board逻辑封装到单独的类中会更好:

public class Board {

    private final int[][] board;

    public Board(int row, int col) {
        board = new int[row][col];
    }

    public boolean isBlocked(int row, int col) {
        if (cell(row - 1, col - 1) == 0 || cell(row - 1, col) == 0 || cell(row - 1, col + 1) == 0)
            return false;
        if (cell(row, col + 1) == 0 || cell(row, col - 1) == 0)
            return false;
        if (cell(row + 1, col - 1) == 0 || cell(row + 1, col) == 0 || cell(row + 1, col + 1) == 0)
            return false;

        return true;
    }

    private int cell(int row, int col) {
        return row < 0 || row >= board.length || col < 0 || col >= board[row].length ? 0 : board[row][col];
    }

}

PS

  

检查您的xyx-列,y-行,因此   arr[y][x],而不是arr[x][y]