2016-12-26 17 views
0

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(); 
} 
+0

확인. 처음 엔 괜찮아 보입니다. 'catch' 절에서'keepPlacing'의 값을 디버그하고 볼 수 있습니까? – MordechayS

+3

'changeMatrixValues'는 실패한 원 자성을 가지지 않는다는 점을 지적 할 가치가 있습니다. "변경"전체가 유효한지 확인하지 않습니다. 이는 하나 이상의 셀을 설정 한 다음 실패 할 수 있음을 의미하며 손상된 상태로 유지합니다. –

+2

또한 :'mMatrix [mRow] [mCol] == 0 && mMatrix [mRow] [mCol]! = 1'은'0! = 1'이므로 중복됩니다. –

답변

0

changeMatrixValues ​​메소드에서 배열 값을 1로 설정하고 IllegalArgumentException을 throw하면이를 롤백하지 않습니다.

private void ship(String shipToPlace, Matrix matrix, int k, int l) { 
    boolean keepPlacing = true; 
    do { 
     try { 
      System.out.println(shipToPlace); 
      chooseGrid(); 
      if(matrix.validate(mRow, mCol, k, l) == true) { 
       matrix.changeMatrixValues(mRow, mCol, k, l); 
       keepPlacing = false; 
      } 
     } catch (IllegalArgumentException ie) { 
      System.out.println(ie.getMessage()); 
     } 
    } while (keepPlacing); 

    matrix.printLabeledMatrix(); 
} 

유효성은 (mRow가 mCol는, k는, l) 방법은 : 도움을

public boolean validate(int i, int j, int k, int l) { 
     for (mRow = i; mRow < (i + k); mRow++) { 
      for (mCol = j; mCol < (j + l); mCol++) { 
       if (mMatrix[mRow][mCol] == 1) { 
        System.out.println("Oops, try again"); 
        return false; 
       } 
      } 
     } 
     return true; 
} 

감사

+0

이 코드의 버그 일 가능성이 있지만 응답하지 않는 것 같습니다 'IllegalArgumentException'가 Throw되었을 때'keepPlacing' 루프가 종료되는 이유에 대한 질문. 제기 된 질문에 대한 답변이없는 경우이 문은 주석을 위해 예약해야합니다. – Guildencrantz

1

이 변화 문제를 해결한다!