Search code examples
javamathadditionmultiplicationsubtraction

Change Value of a Class Variable and Then Call It in Another Class


I'm currently working on a project in which 2 random integers between 0 and 20 are generated. A random operator (+, -, or *) is also selected.

The user must enter the correct answer in 3 attempts. If they get it on the first attempt, they are awarded 5 points, second attempt, 3 points, and third attempt, 1 point. If after 3 attempts they still don't get the correct answer, they receive 0 points and a new set of numbers and an operator are generated.

Here's my question: When I run the tester and enter my answer, the number of tries successfully increments up by 1, but the number of points stays at 0. I did some troubleshooting and found that the value of pt <--(number of points the user has) stays at 0 (its initialized value) because the value of answer stays at 0, even though the switch statement in the randomize() method changes the value of answer.

Here is the code for my project:

1st Class (Adder.java):

package adder;

import java.util.Random;

    public class Adder 
    {
        int int1 = 0;
        int int2 = 0;
        int answer = 0;
        String operator;

        public int randomize()
        {
            Random rnd1 = new Random();

            int1 = rnd1.nextInt(21);
            int2 = rnd1.nextInt(21);
            int op = rnd1.nextInt(3);

            switch(op)
            {
                case 0:
                    operator = "+";
                    answer = int1 + int2;
                    break;

                case 1:
                    operator = "-";
                    answer = int1 - int2;
                    break;

                case 2:
                    operator = "*";
                    answer = int1 * int2;
                    break;
            }

            //Test
            System.out.println(int1);
            System.out.println(int2);
            System.out.println(operator);
            System.out.println(answer);

            return answer;
       }

     public static void main(String[] args) 
     {
         //Test
         //Adder a = new Adder();   
         //a.randomize();
     }
}

2nd Class (AdderGame.java):

package adder;

public class AdderGame 
{
    //1 try = 5 pt, 2 try = 3 pt, 3 try = 1 pt

    int numTries = 0;
    //Number of points the user has, init to 0
    int pt = 0;
    Adder checker = new Adder();

    public int checkAnswer(int a)
    {
        System.out.println("CHECKER.ANSWER = " + checker.answer);

        if (a == checker.answer)
        {
            numTries++;

            switch(numTries)
            {
                case 1:
                    pt = pt + 5;
                    break;

                case 2:
                    pt = pt + 3;
                    break;

                case 3:
                    pt++;
                    break;
            }
        }

        else if (a != checker.answer)
        {
            //Another test output, to see if this loop is entered or not
            System.out.println("INCORRECT");
        }

        return pt;
    }
}

3rd Class (AdderTester.java) (GUI):

package adder;

public class AdderTester extends javax.swing.JFrame
{
    //Create objects from the other two classes
    Adder adder = new Adder();
    AdderGame checker = new AdderGame();

    public AdderTester() {
        initComponents();
        adder.randomize();
        num1Label.setText(Integer.toString(adder.int1));
        num2Label.setText(Integer.toString(adder.int2));
        opLabel.setText(adder.operator);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        num1Label = new javax.swing.JLabel();
        opLabel = new javax.swing.JLabel();
        num2Label = new javax.swing.JLabel();
        answerTextfield = new javax.swing.JTextField();
        confirmButton = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        ptLabel = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        numTriesLabel = new javax.swing.JLabel();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel1.setBackground(new java.awt.Color(54, 69, 79));
        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel1.setFont(new java.awt.Font("Dialog", 1, 36)); // NOI18N
        jLabel1.setForeground(new java.awt.Color(255, 255, 255));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Adder");
        jPanel1.add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 10, 450, -1));

        num1Label.setFont(new java.awt.Font("Dialog", 0, 16)); // NOI18N
        num1Label.setForeground(new java.awt.Color(255, 255, 255));
        num1Label.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        num1Label.setText("num1");
        jPanel1.add(num1Label, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 100, -1, -1));

        opLabel.setFont(new java.awt.Font("Dialog", 0, 16)); // NOI18N
        opLabel.setForeground(new java.awt.Color(255, 255, 255));
        opLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        opLabel.setText("op");
        jPanel1.add(opLabel, new org.netbeans.lib.awtextra.AbsoluteConstraints(200, 100, 40, -1));

        num2Label.setFont(new java.awt.Font("Dialog", 0, 16)); // NOI18N
        num2Label.setForeground(new java.awt.Color(255, 255, 255));
        num2Label.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        num2Label.setText("num2");
        jPanel1.add(num2Label, new org.netbeans.lib.awtextra.AbsoluteConstraints(290, 100, -1, -1));

        answerTextfield.setFont(new java.awt.Font("Dialog", 0, 14)); // NOI18N
        jPanel1.add(answerTextfield, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 140, 260, -1));

        confirmButton.setFont(new java.awt.Font("Dialog", 0, 16)); // NOI18N
        confirmButton.setText("Confirm");
        confirmButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                confirmButtonActionPerformed(evt);
            }
        });
        jPanel1.add(confirmButton, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 310, -1, -1));

        jLabel2.setBackground(new java.awt.Color(255, 255, 255));
        jLabel2.setFont(new java.awt.Font("Dialog", 0, 16)); // NOI18N
        jLabel2.setForeground(new java.awt.Color(255, 255, 255));
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Current Points:");
        jPanel1.add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 180, -1, -1));

        ptLabel.setBackground(new java.awt.Color(255, 255, 255));
        ptLabel.setFont(new java.awt.Font("Dialog", 0, 14)); // NOI18N
        ptLabel.setForeground(new java.awt.Color(255, 255, 255));
        ptLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        ptLabel.setText("pt");
        jPanel1.add(ptLabel, new org.netbeans.lib.awtextra.AbsoluteConstraints(190, 210, 60, -1));

        jLabel3.setBackground(new java.awt.Color(255, 255, 255));
        jLabel3.setFont(new java.awt.Font("Dialog", 0, 16)); // NOI18N
        jLabel3.setForeground(new java.awt.Color(255, 255, 255));
        jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel3.setText("Number of Tries:");
        jPanel1.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 240, 170, -1));

        numTriesLabel.setBackground(new java.awt.Color(255, 255, 255));
        numTriesLabel.setFont(new java.awt.Font("Dialog", 0, 16)); // NOI18N
        numTriesLabel.setForeground(new java.awt.Color(255, 255, 255));
        numTriesLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        numTriesLabel.setText("numTries");
        jPanel1.add(numTriesLabel, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 270, 110, -1));

        getContentPane().add(jPanel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 450, 350));

        pack();
    }// </editor-fold>                        

    private void confirmButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
        //Holds the value for the answer the user inputs
        int userAns = Integer.valueOf(answerTextfield.getText());
        //Holds the value for the answer

        System.out.println("answer = ");
        checker.checkAnswer(userAns);

        ptLabel.setText(String.valueOf(checker.pt));
        numTriesLabel.setText(String.valueOf(checker.numTries));
    }                                             

    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(AdderTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(AdderTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(AdderTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(AdderTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new AdderTester().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JTextField answerTextfield;
    private javax.swing.JButton confirmButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JLabel num1Label;
    private javax.swing.JLabel num2Label;
    private javax.swing.JLabel numTriesLabel;
    private javax.swing.JLabel opLabel;
    private javax.swing.JLabel ptLabel;
    // End of variables declaration                   
}

Solution

  • Your problem is that you declared another Adder in the AdderTester. You called randomize on this adder. But when you check the answer, you are checking on that checker. (the one contained in AdderGame). Here's how to fix this.

    First, add a getAdder method in AdderGame:

    public Adder getAdder() {
        return checker;
    }
    

    Then, change the constructor of AdderTester to this:

    public AdderTester() {
        initComponents();
        checker.getAdder().randomize();
        num1Label.setText(Integer.toString(checker.getAdder().int1));
        num2Label.setText(Integer.toString(checker.getAdder().int2));
        opLabel.setText(checker.getAdder().operator);
    }
    

    And delete this line in AdderTester:

    Adder adder = new Adder();