2015-11-25 2 views
0

Я делаю угадывание номерной программы, и у меня возникают проблемы с моей петлей. Когда я запускаю программу и вводю число в текстовое поле, и нажмите Enter, он замерзает. Я понял, что это может происходить из-за бесконечного цикла. Не стесняйтесь исправить меня, если я ошибаюсь. В основном, когда я ввожу число в текстовое поле и нажимаю Enter, предположим, чтобы изменить метку и изменить цвет фона, но этого не происходит, и я думаю, что это потому, что мой цикл работает до тех пор, пока победа не станет истинной, и когда я набираю свой номер, он продолжает работать это число вместо того, чтобы выводить правильную метку и позволять мне вводить другое число в текстовое поле. P.S: Я знаю, что кнопка newGame еще не работаетGuess Number Game GUI - Бесконечная петля

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class GuessingGame implements ActionListener 
{ 
    JFrame guessFrame; 

    JPanel guessPanel; 

    JTextField guessText; 

    JButton newGame; 

    JLabel rangeLbl, enterGuessLbl, winLbl; 

    Random rand = new Random(); 
    int numToGuess = rand.nextInt(1000)+1; 
    int numOfTries = 0; 
    int guess; 

    public GuessingGame() 
    { 
     // Create the frame and container. 
     guessFrame = new JFrame("Guess the Number"); 
     guessPanel = new JPanel(); 
     guessPanel.setLayout(new GridLayout(5,0)); 


     // Add the widgets. 
     addWidgets(); 

     // Add the panel to the frame. 
     guessFrame.getContentPane().add(guessPanel, BorderLayout.CENTER); 

     // Exit when the window is closed. 
     guessFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Show the converter. 
     guessFrame.pack(); 
     guessFrame.setVisible(true); 
    } 

    // Create and add the widgets for converter. 
    private void addWidgets() 
    { 
     // Create widgets. 
     guessText = new JTextField(); 
     guessText.setHorizontalAlignment(JTextField.CENTER); 
     rangeLbl = new JLabel("I have a number between 1 and 1000. Can you guess my number?", SwingConstants.LEFT); 
     enterGuessLbl = new JLabel("Please enter your guess", SwingConstants.LEFT); 
     winLbl = new JLabel(" ", SwingConstants.CENTER); 
     newGame = new JButton("New Game"); 

     // Listen to events from Convert textfield. 
     guessText.addActionListener(this); 

     // Add widgets to container. 
     guessPanel.add(rangeLbl); 
     guessPanel.add(enterGuessLbl); 
     guessPanel.add(guessText); 
     guessPanel.add(winLbl); 
     guessPanel.add(newGame); 
    } 

    // Implementation of ActionListener interface. 
    public void actionPerformed(ActionEvent event) 
    {   
     boolean win = false; 

     guess = Integer.parseInt(guessText.getText()); 

     if (guess == numToGuess) 
     { 
      win = true; 
     } 
     else if (guess < numToGuess) 
     { 
      winLbl.setText("Too Low"); 
      guessPanel.setBackground(Color.red); 
      guess = Integer.parseInt(guessText.getText()); 
     } 
     else if (guess > numToGuess) 
     { 
      winLbl.setText("Too High"); 
      guessPanel.setBackground(Color.blue); 
      guess = Integer.parseInt(guessText.getText()); 
     } 

     winLbl.setText("Correct!"); 
     guessPanel.setBackground(Color.green); 
    } 

    public static void main(String[] args) 
    { 
     GuessingGame game = new GuessingGame(); 
    } 

} 

ответ

0

Ваш цикл while здесь неуместен, потому что вы находитесь в методе actionPerformed(). Этот метод, скорее всего, будет вызван действием gui (например, нажата кнопка).

Он должен выполнить одно действие, соответствующее вашим потребностям, а затем прекратить действие, так как этот метод вызывается в EDT. Ваш gui не будет выполнять никаких обновлений, пока этот метод не будет завершен.

Таким образом, ничто не изменится (например, ваш статус выигрыша), пока пользователь не предпримет дополнительные действия, которых он не может, поскольку ваш gui заморожен.

+0

Я думаю, я понимаю, возможно, я просто отредактировал вопрос, чтобы опубликовать полный код – TubaShark

+0

удалить цикл while, как было предложено, вам здесь не нужно. – Marcinek

+0

я удалил цикл while, и теперь любое число ввода i верное haha ​​ – TubaShark

0

Вы не обновляете значение угадывания. Вам нужно будет прочитать гадание в конце вашего цикла или, по крайней мере, в тех случаях, когда угадывание и numToGuess не имеют одинакового значения.

В текущем случае: если значения не равны первой итерации, она никогда не станет.

добавить

guess = Integer.parseInt(guessText.getText()); 

, как последнее утверждение друг еще, если блок

EDIT: лучший способ, так как Marcinek указывает, будет удалить время цикла, но так как я не знаю, ваши требования, я не пойду так далеко, чтобы утверждать, что это правильное решение.

+0

я думаю, что я понимание может быть, я просто редактировал вопрос, чтобы отправить полный код – TubaShark

+0

Если вам нужна пользователю продолжить ввод номера, пока он не получил это право, что бы сделать это на самом деле. Но вы также задаете новое значение, если он получил правильное значение. Это не нужно. Но вам нужно перебирать там или проверять текущее значение? – Stultuske

+0

, если он правильно исправит случайное число, я предполагаю, что текстовое поле не имеет значения и покажет, что оно правильно. то для начала новой игры вам придется нажать кнопку. пользователь должен продолжать вводить числа в текстовое поле, получая ответы до тех пор, пока не будет правильно угасано. – TubaShark

0

Вашего цикла держать подножку, потому что это условие if (guess == numToGuess) никогда verfied

  boolean win = false; 

      while (win == false){ 

     if (guess == numToGuess){ 
      win = true; 
      } 
      ....... 
      } 

и выиграть еще ложь, и в то время как петли идет голова подножки.

while (win == false) 
{ 
    .....}