2014-02-05 59 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的代碼嗎?它可能總是返回錯誤。 –

+3

我會把5美元比作字符串而不是equals()! –

+1

...或equalsIgnoreCase()... – vefthym

回答

1

當你第一次給一個錯誤的答案,guessedWord的文字變成了空字符串「」,所以在接下來的迭代中,它永遠不會等於給定詞,因爲你與guessedWord.getText()現在將得到的字符串是「」。

你需要問用戶一個新單詞,然後得到新單詞!

例如,你可以設置你的類私有變量int trials,用5初始化(在main方法),另一種,boolean tryAgain與真正的初始化。然後上面的方法可寫爲:

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 else – user3261887

+0

重點是guessedWord.getText()不會獲得新文本,但始終是相同的。你應該在調用'guessedWordActionPerformed()'方法的時候把do while循環(我猜這是一個Listener)。 'guessedWordActionPerformed()'是一個布爾方法,它只是調用'wordLibrary.isCorrect(wordIdx,guessedWord.getText())'。當它返回5次錯誤時,用戶輸掉。 – vefthym

+0

我用更簡單的方式更新了我的答案... – vefthym

2

這發生在您執行的操作中。當你循環時,你不會給用戶任何時間輸入新的信息。

爲什麼你想在這裏循環?你不需要它。只需檢查一次。如果他們錯了,更改組件並等待ActionPerformed再次被調用。

如果你想給出最大數量的試驗,那麼你應該使用某種形式的非局部變量來存儲它。