虽然while循环错误

问题描述:

嘿家伙我在这里有一个程序,其中用户需要猜测程序本身要求的单词。这些代码没有语法错误,但我的问题在于,每次输入正在请求的正确单词时,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

当你第一次给一个错误的答案,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

这发生在您执行的操作中。当你循环时,你不会给用户任何时间输入新的信息。

为什么你想在这里循环?你不需要它。只需检查一次。如果他们错了,更改组件并等待ActionPerformed再次被调用。

如果你想给出最大数量的试验,那么你应该使用某种形式的非局部变量来存储它。