0

我正在为 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!");
            }
        }

    }

}
4

6 回答 6

2

intOldGuess是方法的局部变量。因此,每次调用该方法时,它都会被初始化为0(默认值)。

要保留该值,您可能希望将变量创建为类字段

class FirstGuessButtonHandler implements ActionListener
 {
        int intOldGuess;

        public void actionPerformed(ActionEvent e)
        {
            int intGuess = 0;

但请记住,在上述情况下,您需要维护相同FirstGuessButtonHandler类实例,因为类字段是针对每个类实例维护的。

其他方法也可以创建intOldGuess静态类字段

于 2013-10-08T06:09:14.530 回答
2

在这个地方:

int intGuess = 0, intOldGuess;
intOldGuess = intGuess;

您正在定义 intOldGuess,但在第二行中,您将值 0 分配给它。您可能应该将此变量保留在类范围内,并且不要将 0 分配给它。

于 2013-10-08T06:11:00.320 回答
2
int intGuess = 0, intOldGuess;

当前包含在方法 actionPerformed() 中,这些需要声明为字段(在方法之外但在类主体中)。

您也可以考虑将它们写为

int intGuess = 0;
int intOldGuess;

为清楚起见(它看起来更干净,并使您的代码更易于阅读)

于 2013-10-08T06:11:14.093 回答
1

如果您想在不重新初始化的情况下使用局部变量,则应避免使用它们。保留变量的值使那些变量Reference variable

你可以这样做-

class ClassName{
     int oldguess;
     public void yourMethod(){
           int newGuess = 0;
于 2013-10-08T06:21:49.050 回答
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 中,但您将其声明为局部变量。如果您希望它在方法调用之间存储数据,则需要将其设置为一个字段。

于 2013-10-08T06:11:18.640 回答
0

问题在于你如何保持状态

 int intGuess = 0, intOldGuess;
 intOldGuess = intGuess;

在这里,您要声明局部变量,每次调用函数时都会重新创建局部变量。

于 2013-10-08T06:12:15.527 回答