我制作了一个使用2D阵列的战列舰游戏,并且需要我的do-while循环才能工作,所以如果您将一艘船放置在已经存在的地方,那么您会被要求再次放置该船。以下是将数组值从0更改为1以类似于船舶位置的代码。如果你试图把一艘船,其中已经存在的1为什么这个do-while循环不起作用?
public int[][] changeMatrixValues(int i, int j, int k, int l) throws IllegalArgumentException { // for a ship with dimensions k*l and starting grid[i][j]
for (mRow = i; mRow < (i + k); mRow++) {
for (mCol = j; mCol < (j + l); mCol++) {
if (mMatrix[mRow][mCol] == 0 && mMatrix[mRow][mCol] != 1)
mMatrix[mRow][mCol] = 1;
else
throw new IllegalArgumentException("Ship already in area");
}
}
return mMatrix;
}
值这是一个不同的类,提示他们想去的地方放置某种类型船舶的用户代码,则抛出一个IllegalArgumentException。它拾取IllegalArgumentException,但是,do-while循环不起作用,并且如果用户将一艘船放在另一艘船的顶部,他们就不会再有机会放置该特定的船,并且游戏继续询问你想要的地方放置下一艘船。如果任何人都可以强调为什么这样做,while循环不工作,那将是伟大的!
private boolean keepPlacing;
private void ship(String shipToPlace, Matrix matrix, int k, int l) {
keepPlacing = true;
do {
try {
System.out.println(shipToPlace);
chooseGrid(); // enter co-ords of where you want to place ship
matrix.changeMatrixValues(mRow, mCol, k, l);
keepPlacing = false;
} catch (IllegalArgumentException ie) {
System.out.println(ie.getMessage());
}
} while (keepPlacing);
matrix.printLabeledMatrix();
}
好的。一开始似乎很好。你可以调试,看看'catch'子句中'keepPlacing'的价值吗? – MordechayS
值得指出的是,'changeMatrixValues'没有失败的原子性:它在创建之前并不检查整个“更改”是否有效。这意味着它可以设置一个或多个单元格,然后失败,从而使事物处于损坏状态。 –
另外:'mMatrix [mRow] [mCol] == 0 && mMatrix [mRow] [mCol]!= 1'是多余的,因为'0!= 1'。 –