简体   繁体   English

使用Java对象创建简单的数学游戏

[英]Create a simple math game using java objects

I am trying to create a Simple math game using Java objects. 我正在尝试使用Java对象创建一个简单的数学游戏。 My goal is to create a question class, which contains a method to show a question with random numbers, a method to check the answer, a question constructure. 我的目标是创建一个问题类,其中包含一个使用随机数显示问题的方法,一种检查答案的方法以及一个问题结构。 How can I generate 10 random questions using these objects? 如何使用这些对象生成10个随机问题? With additions, substraction and multiplication questions. 带有加法,减法和乘法问题。 And print the how many correct answers, at the end. 并在最后打印多少个正确答案。

I have created my question class and my first method shows a random question using the variables "a" and "b". 我已经创建了问题类,并且我的第一种方法使用变量“ a”和“ b”显示了一个随机问题。 and store the answer. 并存储答案。 My second method check the answer with the user input and print the result. 我的第二种方法用用户输入检查答案并打印结果。 So far when I run my program it only shows the same question over and over again. 到目前为止,当我运行程序时,它只会一遍又一遍地显示相同的问题。

This is my Question class 这是我的课题班

import java.util.*;

public class Question {
    private int a;
    private int b;
    private String Question;
    private int correct;
    Random rand = new Random();
    Scanner input = new Scanner(System.in);
    int count = 0;

    Question(int c, int d) {
        x = rand.nextInt(20);
        y = rand.nextInt(20);
    }

    public void askQuestion() {
        if (a > b) {
            System.out.println("What is " + a + " - " + b + " ?\n");
            correct = a - b;
        } else {
            System.out.println("What is " + a + " + " + b + " ?\n");
            correct = a + b;
        }
    }

    public void Check() {
        int response = Integer.parseInt(input.next());
        if (response == correct) {
            System.out.printf("yes.\n");
            count++;
        } else {
            System.out.printf("No. It is " + correct + ".\n");
        }
    }
}

my main method looks like this 我的主要方法是这样的

public class Main {
    public static void main(String[] args) {
        Question q1 = new Question(1,2);
        for (int i = 1; i < 10; i++) {
            q1.askQuestion();
            q1.check();
        }
    }
}

In my output it shows the question with two random numbers but it prints the same question over and over again. 在我的输出中,它显示了带有两个随机数的问题,但是它一次又一次地打印相同的问题。 EX: 例如:

What is 13 - 1 ?

12
That is correct.
What is 13 - 1 ?

12
That is correct.
What is 13 - 1 ?

3
Wrong!. The answer is 12.
What is 13 - 1 ?

Eventually I want my output to look like: 最终,我希望输出如下所示:

What is 4 + 6?

What is 7 - 3?

Any help to fix this? 对解决此问题有帮助吗? and make this game more interactive? 并使游戏更具互动性? Appreciate it. 欣赏它。

Your problem is due to the fact that you are creating one Question object, that generates two random numbers (13 and 1 in your case). 您的问题是由于您正在创建一个 Question对象,该对象会生成两个随机数(在您的情况下为13和1)。 You then go through a loop of asking 10 Questions, but you use the same Question object - so you are using the same random numbers every time. 然后,您将经历一个询问10个问题的循环,但是您使用相同的Question对象-因此每次都使用相同的随机数。 To fix this, do the following changes: 要解决此问题,请进行以下更改:

In your Question constructor, get rid of the parameters, you do not need them. 在您的Question构造函数中,摆脱掉参数,您不需要它们。 Assign to variables a and b : 分配给变量ab

    private Question(){
        a = rand.nextInt(20);
        b = rand.nextInt(20);
    }

So every time you create a Question, you will generate two random numbers which you assign to your variables you declared earlier in the code at the top (in your code, a and b are declared, but not used). 因此,每次创建一个Question时,都会生成两个随机数,这些随机数分配给您在顶部代码中先前声明的变量(在代码中, ab被声明,但未使用)。

Then in your main, change it to the following: 然后在您的主目录中,将其更改为以下内容:

public static void main(String[] args) {
    for(int i = 0; i < 10; i++) {
        Question q1 = new Question();
        q1.askQuestion();
        q1.check();
    }
    System.out.println("Number correct: " + count); //print amount correct, to use this make variable "count" static.
}

The changes are that now you are creating a new Question object every time you go through the loop, and get new random values. 所做的更改是,现在您每次循环时都创建一个新的Question对象,并获得新的随机值。 Every time it asks a new Question, it will create a new Question object with new random values and overwrite the old ones. 每次询问新问题时,都会创建一个具有新随机值的新Question对象,并覆盖旧值。 It will ask the question 10 times after you give and check the answer, after which the program will output number of correct answers and stop. 给出并检查答案后,它将询问10次,然后程序将输出正确答案的数量并停止。

Example output for 3 questions: 3个问题的示例输出:

What is 17 - 15 ?

2
yes.
What is 8 + 11 ?

19
yes.
What is 9 - 0 ?

5
No. It is 9.
Number correct: 2

If you want a way to dynamically ask a question with random numbers and operators, you can create an Operator enum as seen below to handle calculating the result of a left-hand and right-hand value. 如果您想要一种用随机数和运算符动态询问问题的方法,则可以创建一个如下所示的Operator枚举,以处理左手值和右手值的结果。

Also, the calls to System.out.print should be in the main program as much as possible. 另外,对System.out.print的调用应尽可能在主程序中。 Instead, you should return strings from the Question . 相反,您应该从Question返回字符串。

All you need to do is pass the two randomly-generated numbers to the Operator enum and ask it to calculate the result. 您需要做的就是将两个随机生成的数字传递给Operator枚举,并要求其计算结果。

Exam (main) 考试(主要)

package exam;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Exam {
    private static int correctCount = 0;
    private static List<Question> questions = randomQuestions(10);

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        questions.stream().forEach(question -> ask(question, input));
        input.close();
        stats();
    }

    private static void ask(Question question, Scanner input) {
        System.out.print(question.askQuestion());
        double guess = input.nextDouble();
        boolean isCorrect = question.makeGuess(guess);
        System.out.println(question.explain(isCorrect));
        System.out.println();
        correctCount += isCorrect ? 1 : 0;
    }

    private static void stats() {
        double percentage = (correctCount * 1.0d) / questions.size() * 100;
        System.out.printf("Correct: %.2f%% (%d/%d)%n", percentage, correctCount, questions.size());
    }

    private static List<Question> randomQuestions(int count) {
        List<Question> questions = new ArrayList<Question>();
        while (count --> 0) questions.add(new Question());
        return questions;
    }
}

Question (class) 问题(类)

package exam;

import java.util.Random;

public class Question {
    private static final Random RAND = new Random(System.currentTimeMillis());

    private double left;
    private double right;
    private Operator operator;

    public Question(double left, double right, Operator operator) {
        this.left = left;
        this.right = right;
        this.operator = operator;
    }

    public Question(int max) {
        this(randInt(max), randInt(max), Operator.randomOperator());
    }

    public Question() {
        this(10); // Random 0 -> 10
    }

    public String askQuestion() {
        return String.format("What is %s? ", operator.expression(left, right));
    }

    public String explain(boolean correct) {
        return correct ? "Correct" : String.format("Incorrect, it is: %.2f", calculate());
    }

    public boolean makeGuess(double guess) {
        return compareDouble(guess, calculate(), 0.01);
    }

    private double calculate() {
        return operator.calculate(left, right);
    }

    @Override
    public String toString() {
        return String.format("%s = %.2f", operator.expression(left, right), calculate());
    }

    private static boolean compareDouble(double expected, double actual, double threshold) {
        return Math.abs(expected - actual) < threshold;
    }

    private static double randInt(int range) {
        return Math.floor(RAND.nextDouble() * range);
    }
}

Operator (enum) 运算符(枚举)

package exam;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public enum Operator {
    ADD("+", (left, right) -> left + right),
    SUB("-", (left, right) -> left - right),
    MUL("*", (left, right) -> left * right),
    DIV("/", (left, right) -> left / right);

    private static final Random RAND = new Random(System.currentTimeMillis());
    private static final List<Operator> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
    private static final int SIZE = VALUES.size();

    public static Operator randomOperator() {
        return VALUES.get(RAND.nextInt(SIZE));
    }

    private String symbol;
    private Operation operation;

    private Operator(String symbol, Operation operation) {
        this.symbol = symbol;
        this.operation = operation;
    }

    public double calculate(double left, double right) {
        return operation.calculate(left, right);
    }

    public String expression(double left, double right) {
        return String.format("%.2f %s %.2f", left, symbol, right);
    }

    @Override
    public String toString() {
        return symbol;
    }
}

Operation (interface) 操作(界面)

package exam;

public interface Operation {
    double calculate(double left, double right); 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM