2014-04-07 4 views
1

나는 자바에 체스를 쓰고 있는데, 날씨를 점검하기위한이 코드는 때때로 감독에게 장애물이 있으며 때로는 작동하지 않는 경우도있다. 내 실수를 설명해 주시겠습니까 감사합니다!비숍의 비어있는 대각선을 확인하는 방법은 무엇입니까?

public boolean checkifEmpty(int fromRow, int fromColumn, int toRow, 
      int toColumn, Figure[][] ChessBoard) { 
     int differenceInRows = Math.abs(fromRow - toRow); 
     if (differenceInRows == 1) { 
      return true; 
     } 

     for (int j = 1; j < differenceInRows; j++) { 
      if ((toRow < fromRow) && (toColumn > fromColumn) 
        && ChessBoard[fromRow - j][fromColumn + j] == null) { 
       return true; 
      } else if ((toRow > fromRow) && (toColumn > fromColumn) 
        && ChessBoard[fromRow + j][fromColumn + j] == null) { 
       return true; 
      } else if ((toRow > fromRow) && (toColumn < fromColumn) 
        && ChessBoard[fromRow + j][fromColumn - j] == null) { 
       return true; 
      } else if ((toRow < fromRow) && (toColumn < fromColumn) 
        && ChessBoard[fromRow - j][fromColumn - j] == null) { 
       return true; 
      } 

     } 
     return false; 
    } 

답변

1

@AasmundEldhuset 응답 : ! = null인지 확인하고 즉시 false를 반환해야합니다. 루프가 끝나면 모두 정상적으로 진행되어 true를 반환합니다. differenceInRows가 1인지 여부를 확인하는 첫 번째 if 문을 사용하지 않아도됩니다. 차이가 하나라도있을 때 루프를 더 이상 입력하지 않으면됩니다.

수정 코드 :

public boolean checkifEmpty(int fromRow, int fromColumn, int toRow, 
     int toColumn, Figure[][] ChessBoard) { 
    int differenceInRows = Math.abs(fromRow - toRow); 

    for (int j = 1; j < differenceInRows; j++) { 
     if ((toRow < fromRow) && (toColumn > fromColumn) 
       && ChessBoard[fromRow - j][fromColumn + j] != null) { 
      return false; 
     } else if ((toRow > fromRow) && (toColumn > fromColumn) 
       && ChessBoard[fromRow + j][fromColumn + j] != null) { 
      return false; 
     } else if ((toRow > fromRow) && (toColumn < fromColumn) 
       && ChessBoard[fromRow + j][fromColumn - j] != null) { 
      return false; 
     } else if ((toRow < fromRow) && (toColumn < fromColumn) 
       && ChessBoard[fromRow - j][fromColumn - j] != null) { 
      return false; 
     } 

    } 
    return true; 
} 

마지막 음이 방법 대신 당신에게 물고기를주는 낚시하는 방법을 가르쳐 : 당신은 당신의 IDE에서 디버거를 사용하고 버그를 찾을 때까지 코드를 단계별로한다. 이상적으로 JUnit 또는 동등한 것을 사용하여 단위 테스트를 작성해야합니다.

해피 프로그래밍!

2

당신이 바로 그것을 얻기에 매우 가까이있어,하지만 당신은 잘못된 방향으로 주위에 당신의 논리의 한 부분을 가지고 : 당신이 정확하지 않은 빈 셀을 찾을 때 즉시 true를 반환하기 때문에이 더 이상 비어 있지 않은 셀 일 수 있습니다. 빈 셀을 볼 때 어떤 결론을 내릴 수 있습니까? 비어 있지 않은 셀을 발견하면 어떤 결론을 내릴 수 있습니까? 어떤 경우에 그 답이 무엇인지 확신 할 수 있습니까?

+1

ChessBoard [fromRow - j] [fromColumn + j]! = null을 사용하면 어떨까요? 빈 셀을 확인하는 대신 장애물이 될 때 즉시 true를 반환하고 장애물을 검색합니다 – user3505689

+0

@ user3505689 : 단, 대신에'false'를 리턴하거나 메소드의 이름을'checkIfBlocked'로 변경해야합니다. –