2013-08-11 3 views
0
** 

이 이동하고 추가 이동 후 checkForWin의 운전 방식을이기는 이상이 고모 쿠 게임 제작에 여분의 이동 원인은이 직후 checkForWin 방법이어야 승리를 감지 방법하지만 입니다 해당 makeMove 메서드입니다.왜 checkforWin (File f)이 true 일 때 true를 반환하지 않습니까?

**

import java.io.File; 
boolean hasWinner = false; 
File gameFile = new File("src/centralGameFile.txt"); 

do{ 
    //player 1 
    makeMove(gameFile); 
    // check for win 
    if (checkForWin(gameFile)){ 
     hasWinner = true; 
     break; 
    } 
    // player 2 
    makeMove(gameFile); 
    // check for win 
    if (checkForWin(gameFile)){ 
     hasWinner = true; 
     break; 
    } 
}while(hasWinner == false); 

System.out.println("somebody has won the game"); 

/*this method is located in another class in the same package and is 
    called from an instance of the class using the access operator */ 

protected boolean checkForWin(File f){ 
//return true if the file has a winner in it using scanner to look for it 
//this method works correctly when tested with just a file in a test class 
} 

// 간결

/* makeMove(File f) method copies the text from f and over writes 
it adding another character; in context this is a gomoku/tic-tac-toe 
style game but on a bigger board. 
*/ 
+2

원인이 될 수 있는지를 결정하기 너무 적은 정보가 있습니다. 예를 들어,'checkForWin'에 무엇이 있습니까? – bas

+0

전체 "do loop"는 거의 동일합니다 do { makeMove (gameFile); } while (! checkForWin (gameFile)); –

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

답변

2
checkForWin works correctly when tested with just a file in a test class 

코드의 일부 생략/catch 블록 시도 :

do{ 
    //player 1 
    makeMove(gameFile); 
    // check for win 
    if (checkForWin(gameFile)){ 
     hasWinner = true; 
     break; 
    } 
    // player 2 
    makeMove(gameFile); 
    // check for win 
    if (checkForWin(gameFile)){ 
     hasWinner = true; 
     break; 
    } 
}while(hasWinner == false); 

System.out.println("somebody has won the game"); 

을하는 경우를은 true을 반환하며 방법은 makeMove(gameFile)에 매달려 있어야합니다. 이것은 아마도 무한 루프에서 멈출 수 있습니다.

+0

makeMove (gameFile)는 비어 있습니다. ai가 게임에서 버튼을 클릭 할 수 없기 때문에 게임 파일에 이동을 쓰는 AI를 위해서만 존재합니다. 인간이 할 수있는 것처럼,이 무한 루프는 내가 가지고있는 것으로 존재합니까? 코딩되었거나 내가 알고 있지 않은 더 추상적 인 것이 있습니까? (초보자) – James

+0

이 파일의 사용은 사양이 아닌 선택에 의한 것이 아닙니다 – James

+0

코드에 두 개의 중단 점을 넣고 오류가있는 곳을 보시겠습니까? 말 그대로 코드가 실패하면'checkForWin (gameFile);이 true를 리턴하지 못하거나'makeMove (gameFile);'어딘가에 매달려 있어야합니다. – bas

1

나는 귀하의 문제의 원인은 checkForWin이 사실 이 아니며,이 아니라는 것을 제안합니다. 이있을 수 있기 때문에 :

    그 방법 당신의 테스트가 불충분
  • , 또는
  • 파일을 업데이트하는 코드 (예를 들어,이 파일을 플러시/종료되지 않음) 옳은 일을하고 있지 않거나
  • 잘못된 파일을 checkForWin (으)로 호출하고 있습니다.

어느 쪽이든, 여기에 실제로 무엇이 일어나고 있는지에 대한 충분한 정보가 없습니다. 최소한 checkForWin 메소드의 코드를 볼 필요가 있으며 아마도 파일을 업데이트하는 코드를 볼 필요가있을 것입니다.


내가 관심을 가지고 있지만 ...이 코드에서 사소한 오류의 커플 ...하지만 당신에 대해 묻는 문제를 야기하기에 충분하지 :

  1. 귀하의 hasWinner 플래그가를 이중화는 그것을 설정하고 테스트하는 코드와 동일합니다. 루프를 작성한 방법은 두 개의 break 문 중 하나를 실행 한 경우 루프가 끝난 후 명령문을 얻을 수있는 유일한 방법입니다.

  2. 이 (다른 상황에서) 나쁜 스타일 ... 잠재적 위험 :

    ... while (!hasWinner); 
    

    는 첫째, 더 읽을로

    ... while (hasWinner == false); 
    

    작성되어야한다. 모든 Java 프로그래머는 ! 연산자가 무엇을 의미하는지 알고 있어야하며 !을 사용하면이를 표현하는 관용적 인 방법입니다.

    둘째, 오류가 발생하기 쉽습니다. 이것을 고려하십시오 : 당신이 실수로 = 대신 ==를 작성한 다음

    ... while (hasWinner = false); 
    

    . 유감스럽게도 = 양식은 합법적 인 Java이며 ... 과 다른 의미로을 의미합니다. 관용적 인 버전을 사용하면이 실수를 할 수 없습니다.

+0

위의 세 가지 시나리오 중 checkForWin (gameFile)에 사용되는 Scanner에 대한 메소드가 있습니다. 또한 올바른 파일이 메서드에 전달되었는지 확인했습니다. 테스트를 위해이 루프가 아닌 유사한 조건에서 메서드가 true를 반환합니다. 이동 추가에 사용 된 PrintWriter가 파일에 쓰기를 완료하기 전에 검사 프로그램이 이전 파일을 읽을 수 있습니까? 또는 I/O와 비슷한 초보자가 모르는 것을 알고 있습니까? – James

관련 문제