我有一个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
。
是否有一种更简便的方法可以执行此检查或解决异常的方法?
答案 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
检查您的
x
和y
。x
-列,y
-行,因此arr[y][x]
,而不是arr[x][y]
!