我正在为Java作业做猜测游戏,我遇到嵌套if else的逻辑问题。我试图确定两件事:数字是高/低,如果用户变得更热/更冷。我有一个变量intGuess和intOldGuess。我试图将两者比较为更热/更冷,但我最终得到intOldGuess为0,或者当比较时需要与intGuess相同。当然,两者都不正确。以下是我到目前为止的情况:
以下是我认为给我带来麻烦的部分:
public void actionPerformed(ActionEvent e)
{
int intGuess = 0, intOldGuess;
intOldGuess = intGuess;
try
{
intGuess = Integer.parseInt(txaUserGuess.getText().trim());
if (intGuess < intRandomNum)
{
lblHighLow.setText("Too Low");
if (intGuess > intOldGuess)
{
lblHotCold.setText("Getting Colder");
System.out.println(intOldGuess);
System.out.println(intGuess);
}
如果您需要,这是完整的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class GuessNumber extends JFrame
{
private JTextField txaUserGuess;
private JLabel lblStart, lblPrompt, lblHighLow, lblHotCold;
private JButton btnGuess, btnQuit, btnAgain;
private int intRandomNum;
Container c = getContentPane();
public static void main(String args[])
{
GuessNumber app = new GuessNumber();
}
public GuessNumber()
{
super("Guessing Game");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Creates components
btnGuess = new JButton("Guess");
btnQuit = new JButton("Quit");
btnAgain = new JButton("Play Again?");
lblStart = new JLabel("I have a number between 1 and 1000.");
lblPrompt = new JLabel(
"Can you guess my number? Please enter your guess:");
lblHighLow = new JLabel("");
lblHotCold = new JLabel("");
txaUserGuess = new JTextField(5);
setLayout(new FlowLayout());
c.add(lblStart);
c.add(lblPrompt);
c.add(txaUserGuess);
c.add(btnGuess);
c.add(btnQuit);
c.add(btnAgain);
c.add(lblHighLow);
c.add(lblHotCold);
setSize(350, 200);
setVisible(true);
btnAgain.setVisible(false);
RandomNumber();
FirstGuessButtonHandler ghandler = new FirstGuessButtonHandler();
btnGuess.addActionListener(ghandler);
QuitButtonHandler qhandler = new QuitButtonHandler();
btnQuit.addActionListener(qhandler);
AgainButtonHandler ahandler = new AgainButtonHandler();
btnAgain.addActionListener(ahandler);
}
private void RandomNumber()
{
intRandomNum = new Random().nextInt(1000) + 1;
System.out.println(intRandomNum);
}
class QuitButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}
class AgainButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
class FirstGuessButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
int intGuess = 0, intOldGuess;
intOldGuess = intGuess;
try
{
intGuess = Integer.parseInt(txaUserGuess.getText().trim());
if (intGuess < intRandomNum)
{
lblHighLow.setText("Too Low");
if (intGuess > intOldGuess)
{
lblHotCold.setText("Getting Colder");
System.out.println(intOldGuess);
System.out.println(intGuess);
} else if (intGuess < intOldGuess)
{
lblHotCold.setText("Getting Hotter");
}
} else if (intGuess > intRandomNum)
{
lblHighLow.setText("Too High");
} else
{
c.setBackground(Color.GREEN);
lblHighLow.setText("\n\tCorrect!");
txaUserGuess.setEditable(false);
btnAgain.setVisible(true);
btnGuess.setEnabled(false);
}
} catch (NumberFormatException e1)
{
lblHighLow.setText("\n\tEnter a VALID number!");
}
}
}
}
答案 0 :(得分:2)
intOldGuess
是方法的局部变量。因此,每次调用该方法时,它都会初始化为0
(默认值)。
要保留该值,您可能希望将变量创建为类字段
class FirstGuessButtonHandler implements ActionListener
{
int intOldGuess;
public void actionPerformed(ActionEvent e)
{
int intGuess = 0;
但请记住,在上面的情况下,您需要维护FirstGuessButtonHandler
类的相同实例,因为类字段维护每个实例类
其他方法可能是将intOldGuess
创建为静态类字段
答案 1 :(得分:2)
在这里:
int intGuess = 0, intOldGuess;
intOldGuess = intGuess;
您正在定义intOldGuess,但在第二行中您为其指定值0。您可能应该将此变量保留在类范围内,并且不要为其指定0。
答案 2 :(得分:2)
int intGuess = 0, intOldGuess;
当前包含在方法actionPerformed()中,这些需要声明为字段(外部方法,但在类体中)。
您也可以考虑将其写为
int intGuess = 0;
int intOldGuess;
为了清楚起见(它看起来更干净,会让你的代码更容易阅读)
答案 3 :(得分:1)
如果要在不重新初始化的情况下使用局部变量,则应避免使用局部变量。
要保留变量的值,请使用Reference variable
。
你可以这样做 -
class ClassName{
int oldguess;
public void yourMethod(){
int newGuess = 0;
答案 4 :(得分:0)
if (intGuess < intRandomNum)
{
lblHighLow.setText("Too Low");
if (intGuess > intOldGuess)
{
lblHotCold.setText("Getting Colder");
System.out.println(intOldGuess);
System.out.println(intGuess);
}
问题是,你有第二个嵌套在第一个。如果第一个有效,则仅检查第二个。因此,第二个条件永远不会成立。 (它只检查intGuess是否大于inOldGuess,如果intGuess小于intOldGuess,则永远不会。
如果不是第一个,你需要选择第二个。
此外,您似乎想要在intOldGuess中存储数据,但您将其声明为局部变量。如果您希望它在方法调用之间存储数据,则需要将其设置为字段。
答案 5 :(得分:0)
问题在于你如何保持状态
int intGuess = 0, intOldGuess;
intOldGuess = intGuess;
在这里,您将声明局部变量,每次调用函数时都会重新创建局部变量。