2014-02-05 3 views
0

안녕하세요 여러분, 프로그램 자체에서 묻는 단어를 사용자가 추측해야하는 프로그램이 있습니다. 코드에는 구문 오류가 없지만 요청할 때마다 올바른 단어를 입력 할 때마다 JOptionPane (ErrorMessage)이 계속 표시됩니다.while 루프 오류가 발생합니다.

내가 원했던 것은 사용자가 마지막 시도에서 잘못된 단어를 입력하면 5 번만 시도 할 수 있다는 것입니다. 요청한 단어가 올바르게 표시되어야합니다. 사용자가 올바른 단어를 입력하면 다음 단어로 이동해야합니다. 이걸 고치는 걸 도와주세요. 벌써 3 시간 동안 여기 붙어 있습니다. 고맙습니다.

private void guessedWordActionPerformed(java.awt.event.ActionEvent evt) {            
     int trials = 5; 
     boolean tryAgain = true; 

     do{ 

     if (wordLibrary.isCorrect(wordIdx, guessedWord.getText())){ 
      JOptionPane.showMessageDialog(null, "Your answer is correct! Guess another word.","", JOptionPane.INFORMATION_MESSAGE); 
      getRootPane().setDefaultButton(nextTrial); 
      guessedWord.setText(""); 

      wordIdx = (wordIdx + 1) % wordLibrary.getSize(); 
      scrambledWord.setText(wordLibrary.getScrambledWord(wordIdx)); 
      guessedWord.setText(""); 
      getRootPane().setDefaultButton(guessButton); 
      guessedWord.requestFocusInWindow(); 
      tryAgain = false; 
      } 
     else if (!wordLibrary.isCorrect(wordIdx, guessedWord.getText())) { 
      JOptionPane.showMessageDialog(null, "Your answer " + guessedWord.getText() + " is wrong.\n Number of trials remaining: " + trials , 
        "Incorrect Answer", JOptionPane.ERROR_MESSAGE); 
      trials--; 
      guessedWord.setText(""); 
      tryAgain = true; 
     } 
     }while(tryAgain && trials > 0); 

     guessedWord.requestFocusInWindow(); 
    } 

//This is the isCorrect method 
public boolean isCorrect(int idx, String userGuess) { 
     return userGuess.equalsIgnoreCase(getWord(idx)); 
    } 
+4

isCorrect의 코드를 볼 수 있습니까? 그것은 항상 false를 반환 할 수 있습니다. –

+3

나는 equals() 대신에 ==를 사용하여 문자열 비교에 5 달러를 투입 할 것입니다! –

+1

... 또는 equalsIgnoreCase() ... – vefthym

답변

1

먼저 잘못된 대답을 줄 때, 주어진 단어와 동일하지 않습니다 다음 반복에서, 그래서 guessedWord의 텍스트, 빈 문자열 ""가 있기 때문에 당신이 guessedWord.getText() 지금 의지 얻을 문자열 "".

사용자에게 새 단어를 물어보고 새 단어를 가져와야합니다.

예를 들어 클래스에 private 변수 int trials을 설정하고 5 개 (기본 메소드에서) 및 또 하나 boolean tryAgain을 true로 초기화하여 초기화 할 수 있습니다. 그런 다음 위의 방법은 다음과 같이 작성 될 수 있습니다.

private void guessedWordActionPerformed(java.awt.event.ActionEvent evt){   

    if (tryAgain && trials > 0) {         
    if (wordLibrary.isCorrect(wordIdx, guessedWord.getText())){ 
     JOptionPane.showMessageDialog(null, "Your answer is correct! Guess another word.","", JOptionPane.INFORMATION_MESSAGE); 
     getRootPane().setDefaultButton(nextTrial); 
     guessedWord.setText(""); 

     wordIdx = (wordIdx + 1) % wordLibrary.getSize(); 
     scrambledWord.setText(wordLibrary.getScrambledWord(wordIdx)); 
     guessedWord.setText(""); 
     getRootPane().setDefaultButton(guessButton); 
     guessedWord.requestFocusInWindow(); 
     tryAgain = false; 
    } else { 
     trials--; 
     JOptionPane.showMessageDialog(null, "Your answer " + guessedWord.getText() + " is wrong.\n Number of trials remaining: " + trials , 
       "Incorrect Answer", JOptionPane.ERROR_MESSAGE);    
     guessedWord.setText(""); 
     tryAgain = true; 
    } 

    } else { 
     //show "the correct word was..." 
    } 
    guessedWord.requestFocusInWindow(); 
} 
+0

제안 해 주셔서 감사합니다.하지만 여전히 작동하지 않습니다. guessedWord.setText ("");를 삭제하려고했습니다. else 문을 이미 else 문으로 바꾼 경우 – user3261887

+0

guessedWord.getText()는 새 텍스트를 가져 오지 않지만 항상 동일합니다. 당신은'guessedWordActionPerformed()'메서드를 호출 할 때 do while 루프를 두어야한다 (나는 Listener라고 생각한다). 'guessedWordActionPerformed()'는 부울 메소드이며'wordLibrary.isCorrect (wordIdx, guessedWord.getText()) '를 호출하는 것입니다. false를 5 회 반환하면 사용자가 손실됩니다. – vefthym

+0

내 대답을 좀 더 간단하게 업데이트했습니다 ... – vefthym

2

이것은 수행 한 작업에서 발생합니다. 반복 할 때 사용자는 새로운 정보를 입력 할 수있는 시간을주지 않습니다.

왜 여기에 루프 하시겠습니까? 너는 필요 없어. 한번만 확인하십시오. 그들이 틀린 경우에 성분을 바꾸고 ActionPerformed가 다시 불릴 것을 기다리십시오.

최대 시도 횟수를주고 싶다면 어떤 형식의 비 로컬 변수를 사용하여 저장해야합니다.