我製作了一個使用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'。 –