2D Array를 사용하여 전함 게임을 만들었고, 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 루프가 작동하지 않으며 사용자가 배를 다른 배 위에 놓으면 다른 배를 배치 할 기회가 없으며 게임에서 원하는 곳으로 물어 봅니다 다음 우주선을 배치합니다. 누구라도이 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'의 값을 디버그하고 볼 수 있습니까? – MordechayS
'changeMatrixValues'는 실패한 원 자성을 가지지 않는다는 점을 지적 할 가치가 있습니다. "변경"전체가 유효한지 확인하지 않습니다. 이는 하나 이상의 셀을 설정 한 다음 실패 할 수 있음을 의미하며 손상된 상태로 유지합니다. –
또한 :'mMatrix [mRow] [mCol] == 0 && mMatrix [mRow] [mCol]! = 1'은'0! = 1'이므로 중복됩니다. –