我正在猜数字程序,我的循环遇到了问题。当我运行程序并在文本字段中输入一个数字并点击输入它冻结。我发现这可能是因为无限循环而发生的。如果我错了,请随意纠正我。基本上当我在文本字段中输入一个数字并按下输入时,它会改变标签并改变背景颜色,但这不会发生,我认为这是因为我的循环运行直到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();
}
}
答案 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)
{
.....}