Я сделал игру с линкорами с использованием 2D-массивов и нуждаюсь в моем цикле do-while, чтобы работать, поэтому, если вы разместите корабль там, где его уже есть, вас попросят снова отправить корабль. Ниже приведен код, который изменяет значения массива от 0 до 1, чтобы напоминать размещение кораблей. Он бросает IllegalArgumentException если вы попытаетесь поместить корабль, где есть уже значение 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, однако цикл 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();
}
OK. Кажется, все хорошо. Можете ли вы отладить и посмотреть, что является значением 'keepPlacing' в предложении' catch'? – MordechayS
Стоит отметить, что 'changeMatrixValues' не обладает отказоустойчивостью: он не проверяет, что все« изменения »действительны до его создания. Это означает, что он может устанавливать одну или несколько ячеек, а затем терпеть неудачу, оставляя вещи в коррумпированном состоянии. –
Также: 'mMatrix [mRow] [mCol] == 0 && mMatrix [mRow] [mCol]! = 1' является избыточным, так как' 0! = 1'. –