Создать простую математическую игру с использованием Java-объектов - PullRequest
1 голос
/ 24 марта 2019

Я пытаюсь создать простую математическую игру, используя объекты Java. Моя цель - создать класс вопросов, который содержит метод для отображения вопроса со случайными числами, метод проверки ответа, конструкцию вопроса. Как я могу создать 10 случайных вопросов, используя эти объекты? С дополнениями, вычитанием и умножением вопросов. И напечатайте, сколько правильных ответов, в конце.

Я создал свой класс вопросов, и мой первый метод показывает случайный вопрос, используя переменные «a» и «b». и сохраните ответ. Мой второй способ проверить ответ с помощью ввода пользователя и распечатать результат. До сих пор, когда я запускаю свою программу, она снова и снова показывает только один и тот же вопрос.

Это мой вопрос класса

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");
        }
    }
}

мой основной метод выглядит так

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();
        }
    }
}

В моем выводе он показывает вопрос с двумя случайными числами, но выводит один и тот же вопрос снова и снова. 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 ?

В конце концов я хочу, чтобы мой вывод выглядел так:

What is 4 + 6?

What is 7 - 3?

Любая помощь, чтобы исправить это? и сделать эту игру более интерактивной? Цени это.

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Если вам нужен способ динамического задания вопроса со случайными числами и операторами, вы можете создать перечисление Operator, как показано ниже, для обработки вычисления значения для левой и правой руки.

Также, звонки на System.out.print должны быть как можно больше в основной программе. Вместо этого вы должны вернуть строки из Question.

Все, что вам нужно сделать, это передать два случайно сгенерированных числа в перечисление Operator и попросить его вычислить результат.

Экзамен (основной)

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;
    }
}

Вопрос (класс)

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);
    }
}

Оператор (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;
    }
}

Операция (интерфейс)

package exam;

public interface Operation {
    double calculate(double left, double right); 
}
0 голосов
/ 24 марта 2019

Ваша проблема связана с тем, что вы создаете один объект вопроса, который генерирует два случайных числа (13 и 1 в вашем случае). Затем вы проходите цикл задавания 10 вопросов, но вы используете один и тот же объект «Вопрос», поэтому каждый раз вы используете одни и те же случайные числа. Чтобы это исправить, внесите следующие изменения:

В конструкторе Вопросов избавьтесь от параметров, они вам не нужны. Присвоить переменным a и b:

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

Таким образом, каждый раз, когда вы создаете Вопрос, вы генерируете два случайных числа, которые вы присваиваете своим переменным, которые вы объявили ранее в коде вверху (в вашем коде a и b объявлены, но не используются ).

Затем в вашей основной записи измените его на следующее:

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.
}

Изменения заключаются в том, что теперь вы создаете новый объект Question каждый раз, когда проходите цикл, и получаете новые случайные значения. Каждый раз, когда он задает новый Вопрос, он создает новый объект Вопрос с новыми случайными значениями и перезаписывает старые. Он задаст вопрос 10 раз после того, как вы дадите и проверите ответ, после чего программа выведет количество правильных ответов и остановится.

Пример вывода на 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
...