【发布时间】:2016-12-26 19:03:21
【问题描述】:
我已经使用 2D 阵列制作了一个战舰游戏,并且需要我的 do-while 循环才能工作,所以如果你将一艘船放置在已经有一艘船的地方,你会被要求再次放置这艘船。下面是将数组值从 0 更改为 1 以类似于船舶放置的代码。如果您尝试将船放置在已经有 1 值的地方,它会抛出 IllegalArgumentException。
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,但是,do-while 循环不起作用,如果用户将一艘船放在另一艘船的顶部,他们就没有机会再放置那艘特定的船,游戏继续询问您想要的位置放置下一艘船。如果有人能强调为什么这个 do-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的值是多少? -
值得指出的是,
changeMatrixValues没有失败原子性:它不会在进行之前检查整个“更改”是否有效。这意味着它可以设置一个或多个单元然后失败,从而使事物处于损坏状态。 -
另外:
mMatrix[mRow][mCol] == 0 && mMatrix[mRow][mCol] != 1是多余的,因为0 != 1。 -
另外:这是使用异常来表示不是异常情况的情况。为什么不从该方法返回一个布尔值:true 表示成功、有效的移动;如果无效,则为 false。不需要返回成员变量。
-
感谢安迪·特纳指出我的其他问题。循环工作正常,我刚刚将初始 keepPlacing 移到调试器显示为始终设置为 false 的方法之外,导致循环失败
标签: java loops multidimensional-array do-while throws