猜数字游戏GUI - 无限循环

时间:2015-11-25 07:28:35

标签: java loops user-interface random

我正在猜数字程序,我的循环遇到了问题。当我运行程序并在文本字段中输入一个数字并点击输入它冻结。我发现这可能是因为无限循环而发生的。如果我错了,请随意纠正我。基本上当我在文本字段中输入一个数字并按下输入时,它会改变标签并改变背景颜色,但这不会发生,我认为这是因为我的循环运行直到win变为真,当我输入我的数字时它会继续运行该数字而不是输出正确的标签,让我输入一个不同的数字到文本字段。 P.S:我知道newGame按钮不起作用

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();
    } 

}

3 个答案:

答案 0 :(得分:0)

您不会更新guess的值。你需要在循环结束时读取猜测,或者至少在那些猜测和numToGuess没有相同值的情况下。

在当前情况下:如果值不等于第一次迭代,它将永远不会变为。

添加

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

作为块的最后一个声明

编辑:正如Marcinek指出的那样,更好的方法是删除while循环,但由于我不了解你的要求,所以我不会去宣称它。是正确的溶剂。

答案 1 :(得分:0)

您的while循环在此处不合适,因为您使用的是actionPerformed()方法。这种方法最有可能在gui动作上被调用(例如按钮踢)。

它应该根据您的需要执行一个操作,然后终止,因为在EDT中调用此方法。在此方法完成之前,您的gui不会执行任何更新。

因此,在用户做出一些额外的动作之前,任何事情都不会改变(例如你的获胜状态),因为你的gui被冻结,所以他不能这样做。

答案 2 :(得分:0)

你的循环一直在运行,因为这个条件if ( guess == numToGuess)永远不会被验证

         boolean win = false;

          while (win == false){

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

和 赢得仍然是假的,而循环则是一个头脑。

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