2014-10-22 7 views
0

다음 코드 블록은 사용자가 입력 한 좌표가 우주선의 좌표인지 확인합니다. 배는 (1,1)과 (1,2)에 2 차원 배열로 배치됩니다.Java를 사용하여 Battleship을 만드는 데 문제가 있습니다.

getUserGuess 메서드 구현을 while 루프로 둘러싸면 문제가 시작되었습니다. 루프는 우주선이 아직 살아 있는지 확인하고 우주선이 가라 앉을 때까지 좌표 입력을 계속 요구합니다. 그러나 사용자가 올바른 좌표 쌍 중 하나를 입력하자마자 전체 선박이 가라 앉습니다.

왜 이러한 일이 계속 발생하는지 알 수 없습니다. 루프를 주석 처리하자 마자 문제는 멈추지 만 루프가 필요합니다.

public void checkResult(String userGuess) { 
    while (frigateIsAlive == true) { 
     if (userGuess.equalsIgnoreCase(board[1][1])){ 
      System.out.println("hit!"); 
      numOfHitsOnFrigate++; 
      board[1][1] = " *"; 
      createBoard(); 
     } 
     if (userGuess.equalsIgnoreCase(board[1][2])) { 
      System.out.println("hit!"); 
      numOfHitsOnFrigate++; 
      board[1][2] = " *"; 
      createBoard(); 
     } 
     else if (numOfHitsOnFrigate == 2) { 
      System.out.println("Enemy frigate has been sunk!"); 
      frigateIsAlive = false; 
      break; 
     } 
     else { 
      System.out.println("miss!"); 
      // try again 
     } 
    } 
} 

public String getUserGuess() 
{ // takes the users guess 

    System.out.println("Choose a coordinate on the board to fire at"); 
    int x = input.nextInt();               
    int y = input.nextInt(); 

    String userGuess = board[x][y]; 
    return userGuess; 
} 

당신이 더 나은 나를 돕기 위해 코드의 다른 부분을 볼 필요 알려줘 : 여기

는 방법이다.

+0

사용 (frigateIsAlive) 동안 대신 동안 (frigateIsAlive == true)가 –

+0

내가 당신을 뭔가 다른 논리는 결함이 제대로 – KRUKUSA

+0

을 증가시키는 것 확인하기 위해 당신이 numOfHitsonFrigate''의 값을 출력 할 수 numOfHitsOnFrigate 내부 이동하고있다 생각 여기에'while '이 필요 없다.'userGuess'가 루프를 입력하면'board [1] [1]'에 대해 좋은 것으로 가정하고, 처음'if'에서 2 번 지나면 나올 뿐이다. 당신이 원하는 것이 아니라는 것이 확실합니다. –

답변

3

이 방법은 결함이 : [1] [1], 루프를 만들 것입니다

  • 일치 보드 userGuess 경우 두 번 numOfHitsOnFrigate을 증가하고 당신이 거짓 종료에 frigateIsAlive을 변경할 수 있습니다.

  • userGuess이 보드 [1] [2]와 일치하면 루프가 증가하여 numOfHitsOnFrigate 번 반복되며 종료하지 않습니다.

  • userGuess이 일치하지 않으면 루프가 종료되지 않고 새로운 입력을받지 않고 인쇄를 계속합니다 (miss!).

당신은 조건이 방법은 하나의 userGuess를 확인하기 때문에, 루프를 제거하고 변경해야합니다 - I surrounded the getUserGuess method implementation with a while loop. -

public void checkResult(String userGuess) { 
     if (userGuess.equalsIgnoreCase(board[1][1])){ 
      System.out.println("hit!"); 
      numOfHitsOnFrigate++; 
      board[1][1] = " *"; 
      createBoard(); 
     } else if (userGuess.equalsIgnoreCase(board[1][2])) { 
      System.out.println("hit!"); 
      numOfHitsOnFrigate++; 
      board[1][2] = " *"; 
      createBoard(); 
     } else { 
      System.out.println("miss!"); 
      // try again 
     } 
     if (numOfHitsOnFrigate == 2) { 
      System.out.println("Enemy frigate has been sunk!"); 
      frigateIsAlive = false; 
     } 
} 

은 당신이 쓴 내용에 기초를 당신은 점점 입력을 유지 다른 루프가 사용자로부터 코드가 없으면 다른 루프가 필요합니다. 게임을하지 않으면 게임이 진행되지 않습니다.

+0

다른 루프가 없으므로 조언을 받고 방법을 수정했습니다. 이제이 전체 메서드가 루프에 의해 둘러싸여 있어야하는 경우 궁금한 것은 무엇입니까? 또는 getUserGuess 메서드 구현을 루프로 묶어야합니까? –

+0

@Cherry_Developer하지만 당신은 "getUserGuess 메소드를 while 루프로 둘러 쌌다"고 했지. 귀하의 질문에'getUserGuess' 메서드가 표시되지 않습니다. 나는'checkResult' 만 볼 수있다. – Eran

+0

@Cherry_Developer 좋아, 그래서 당신은 getUserGuess를 호출하고 그 추측이 우주선을 가라 앉히는 미스, 히트 또는 히트인지 확인하는 게임 루프가 필요해 보인다. checkResult 메소드는 단일 선박에 대한 점검을 수행합니다. 배가 여러 개인 경우 비슷한 방법을 여러 개 호출하거나 모든 배를 검사하는 단일 메서드를 호출해야합니다. – Eran

1

는 아마 (의사 코드) 원하는 무엇 :

  • 시작 (루프)를
  • 침몰 추측
  • 에 대한 추측에 대한
  • 검사 결과를 사용자에게 =>/정지 =>는

을 시작 계속 침몰하지 (당신이 잘못 즉, 당신의 while 루프)

,
관련 문제