0

ランダムな質問を生成し、どの質問が間違っているかを追跡して書く数学クイズゲームを作ろうとしています。

アクションリスナーを機能させましたが、答えを入力すると、正しいのに答えが間違っていると表示されます。表示される最初の質問は正常に機能しますが、その後は、正しいものであり、スコアを追跡しているにもかかわらず、私の答えはすべて間違っていると表示されます。

 import java.util.Scanner;
        import javax.swing.*;
        import javax.swing.border.TitledBorder;

        import java.util.Random;
        import java.util.Scanner;
        import java.awt.*;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;

        public class PracticeMath extends JFrame implements ActionListener {
            Scanner k = new Scanner(System.in);
            Random generator = new Random();
            protected JButton excerciseButton = new JButton( "New Excerices" ); // start new quiz session
            protected JButton answerButton = new JButton( "Answer" ); // set new question, check if the answer correct or wrong
            protected JLabel titlelabel = new JLabel( "How much is: " ); 
            protected int correctcounter = 0; // keep track of correct answer
            protected int wrongcounter = 0; // keep track of wrong answer
            protected int one = generator.nextInt(10);//generate ranodm first number of question
            protected int two = generator.nextInt(10); // generate random second number of question
            protected int i = generator.nextInt(4); // generate random operator
            protected char[] ops = { '+', '-', '/', '*' }; // the math operator
            protected JLabel correctlabel = new JLabel(" Number of Correct Answer: ");
            protected JLabel wronglabel = new JLabel( " Number of  Wrong answers:  " );
            protected JLabel firstnum = new JLabel("" + one); // display first number
            protected JLabel secondnum = new JLabel("" + two); //  display second number
            protected JLabel randomOP = new JLabel("" + ops[i]); // display operator
            protected JLabel equalOP = new JLabel("=");
            protected JTextField answerText = new JTextField(); //text area for writing you answer
            protected JLabel questionmark = new JLabel("?");
            protected JLabel correct = new JLabel(""+ correctcounter); // display correct answer
            protected JLabel wrong = new JLabel(""+ wrongcounter); // display wrong answer
            protected JLabel commentlabel = new JLabel(""); // set a comment for how good you doing. optionial




            public PracticeMath(){

                answerText.setColumns(5);

                JPanel Panel1 = new JPanel();// add a panel
                FlowLayout flowLayout = (FlowLayout) Panel1.getLayout();// layout for panel
                getContentPane().setLayout( new FlowLayout( FlowLayout.LEFT, 5, 5)); // set layout
                getContentPane().add(Panel1); // set panel
                titlelabel.setForeground(Color.ORANGE); 
                titlelabel.setFont(new Font("Tahoma", Font.PLAIN, 25));

                Panel1.add(titlelabel);
                firstnum.setFont(new Font("Tahoma", Font.PLAIN, 20));
                Panel1.add(firstnum);

                randomOP.setFont(new Font("Tahoma", Font.PLAIN, 25));
                Panel1.add(randomOP);

                secondnum.setFont(new Font("Tahoma", Font.PLAIN, 20));

                Panel1.add(secondnum);

                equalOP.setFont(new Font("Tahoma", Font.PLAIN, 20));
                Panel1.add(equalOP);

                Panel1.add(answerText);

                questionmark.setFont(new Font("Tahoma", Font.PLAIN, 20));
                Panel1.add(questionmark);

                Panel1.add(commentlabel);



                JPanel Panel3 = new JPanel();
                FlowLayout flowLayout3 = (FlowLayout) Panel3.getLayout();
                flowLayout3.setHgap(15);
                getContentPane().setLayout( new FlowLayout( FlowLayout.LEFT, 5, 5));
                getContentPane().add(Panel3);
                Panel3.add(excerciseButton);
                Panel3.add(answerButton);



                    JPanel panel2 = new JPanel();
                panel2.setBorder(new TitledBorder("Statistic"));
                getContentPane().add(panel2);
                panel2.setLayout(new GridLayout(0, 2, 0, 0));
                panel2.add(correctlabel);
                panel2.add(wronglabel);
                correct.setForeground(Color.GREEN);
                correct.setFont(new Font("Tahoma", Font.PLAIN, 25));
                panel2.add(correct);

                wrong.setForeground(Color.RED);
                wrong.setFont(new Font("Tahoma", Font.PLAIN, 25));
                panel2.add(wrong);




            answerButton.addActionListener( this );

            }






           public static void main(String[] args) {

                PracticeMath frame = new PracticeMath();
                frame.pack();
                frame.setLocationRelativeTo(null);  
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400,400);
                frame.setTitle( "Math Practice");
                frame.setVisible(true);





            }

         public void actionPerformed( ActionEvent ae )
   {
       String answer = answerText.getText();
       int answerint = Integer.parseInt(answer);
       if(one + two == answerint){
            correctcounter++;
            System.out.println("correct");
            firstnum.setText("" + generator.nextInt(11));
               randomOP.setText("" + ops[generator.nextInt(4)]);
               secondnum.setText("" + generator.nextInt(11));


        }
       else if(one-two == answerint){
            correctcounter++;
            System.out.println("correct");
            firstnum.setText("" + generator.nextInt(11));
               randomOP.setText("" + ops[generator.nextInt(4)]);
               secondnum.setText("" + generator.nextInt(11));
        }
        else if(one * two ==answerint){
            correctcounter++;
            System.out.println("correct");
            firstnum.setText("" + generator.nextInt(11));
               randomOP.setText("" + ops[generator.nextInt(4)]);
               secondnum.setText("" + generator.nextInt(11));
        }else if(one/two == answerint){
            correctcounter++;
            System.out.println("correct");
            firstnum.setText("" + generator.nextInt(11));
               randomOP.setText("" + ops[generator.nextInt(4)]);
               secondnum.setText("" + generator.nextInt(11));
        }
        else{
            wrongcounter++;
            System.out.println("wrong");
            firstnum.setText("" + generator.nextInt(11));
               randomOP.setText("" + ops[generator.nextInt(4)]);
               secondnum.setText("" + generator.nextInt(11));
        }
   }
}
4

2 に答える 2

1

変数oneとを再割り当てすることは決してないtwoので、それらはまだ最初に使用したのと同じ値を使用しています...

メソッドを再構築actionPerformedしてコードの重複を減らし、新しい方程式の値をonetwo変数に割り当ててみてください。

public void actionPerformed(ActionEvent ae) {
    String answer = answerText.getText();
    int answerint = Integer.parseInt(answer);
    if (one + two == answerint) {
        correctcounter++;
        System.out.println("correct");
    } else if (one - two == answerint) {
        correctcounter++;
        System.out.println("correct");
    } else if (one * two == answerint) {
        correctcounter++;
        System.out.println("correct");
    } else if (one / two == answerint) {
        correctcounter++;
        System.out.println("correct");
    } else {
        wrongcounter++;
        System.out.println("wrong");
    }
    one = generator.nextInt(11);
    two = generator.nextInt(11);
    firstnum.setText("" + one);
    randomOP.setText("" + ops[generator.nextInt(4)]);
    secondnum.setText("" + two);
}

更新しました

あなたが正しい答えと間違った答えのカウンターを維持している間、あなたはそれらをどこにも表示していません(私がプログラムを最初に実行したときに私をびっくりさせました)。

メソッドの下部で、actionPerformed正解と不正解の数を表示するラベルを更新する必要があります。

public void actionPerformed(ActionEvent ae) {
    // ... Previous content... //

    correct.setText(Integer.toString(correctcounter));
    wrong.setText(Integer.toString(wrongcounter));
}
于 2013-02-12T23:58:24.573 に答える
1

では、各質問に回答した後、テキストフィールド(および)を新しいランダムな値でactionPerformed更新しているように見えますが、変数とを使用して回答を確認しています。表示されているランダムな値で更新されないため、最初の質問に回答した後に表示される値と同期しなくなります。firstnumsecondnumonetwoonetwo

于 2013-02-12T23:50:52.747 に答える