Java-программа, как добавить функцию, которая возвращает код, если игрок ввел его неправильно

У меня проблема с моей программой, а не с кодом, это то, как я собираюсь это сделать, это запутанная часть, с которой я застрял. просто чтобы вы знали, что я базовый Java-кодер, я не понимаю сложных вещей, поэтому имейте в виду, что мой код не самый лучший.

-------------------------------------------------- --------- объяснение программы --------------------------------------- -------------------------- Давайте рассмотрим, как это работает, прежде чем я покажу вам свою проблему, хорошо, когда вы запустите программу предложит вам что-то вроде меню в видеоигре, но оно основано на тексте, оно отображает различные варианты, такие как ввод информации об игроке, просмотр результатов математической игры, а затем выход. введите данные об игроке, он говорит игроку 1, чтобы ввести его / ее имя, а затем говорит другому, чтобы ввести имя игрока, а затем предлагает вам вернуться в меню. играть в математическую игру - это когда игрока 1 просят ввести математическое уравнение после того, как этот игрок 2 должен решить его, если он правильно понял, он получает 10 баллов, если ни один игрок не получает вообще никаких баллов. затем повторяет, чтобы другой игрок ввел математическое уравнение, после чего предлагает вернуться в меню. Показать баллы: показывает, кто набрал наибольшее количество баллов в математической игре. Он рассчитывает, кто набрал наибольшее количество баллов, если оба они набрали одинаковое количество баллов, а затем означает ничью, а затем предлагает вам вернуться в меню. и, наконец, опция выхода, когда вы выбираете эту опцию, она останавливает программу. если игрок выбирает неправильный выбор, он получает сообщение об ошибке и возвращает вас в меню

Хорошо, вот первый класс, называемый меню и другой класс, который связан с меню, называемым игровых фракций

меню: https://gist.github.com/LOLMEHA/86ff28b038d85030e346785e953644e0 игровые фракции: https://gist.github.com/LOLMEHA/f05a51e07c8823a0e65cebbf81cc52ef

так что этот раздел кода, который я испытываю затруднения, перебирая это сам

import java.util.*;
public class Gamefunctions // this is a core when player choosess one of these options from the menu 
{
     String[] player =new String[2];
    double scorea = 0; // verribles of all the objects 
    double scoreb = 0;
    int i;
    Scanner input = new Scanner(System.in);
   double answer = 0;
    double numA, numB;
    char operator;
    char operator2;
    boolean quit = false;
    double sum1;
    double sum2;



    public void enterDetails(){ // if player select    enter details 
    for ( i=0;i<2;i++) {// tell's player to input he/she's name and stores them 
      int c=i;
      System.out.println("Welcome to the maths quiz game please input player name "+c++);
      player[i] = input.next();

    }
}

    public void mathGame(){ // if player select    enter details 

      System.out.println("Please enter your equation please "+player[0]+" press enter for each number and mathematical symbol"); // tells the player 1 to input
      System.out.println("");
      System.out.println("such as for ex input a number or how many you like, then hit enter and input such as /*-+^ hit enter, then  input any  number one or how many you like ");
      String s=input.next();
      numA = Double.parseDouble(s); // numa and numb and operator is the aera of player to input he/she equation 
      operator = input.next().charAt(0);
      numB = input.nextDouble();
       if () { 

       if (operator == '+') {// this is if operator is one of these like +-*/^ and then it works out the sum 
        answer = numA + numB;
        }
       if (operator == '-') {
        answer = numA - numB;
        }
       if (operator == '*') {
        answer = numA * numB;
        }
       if (operator == '/') {
        answer = numA / numB;
        }
       if (operator == '^') {
        answer = Math.pow(numA, numB);
        }
      } else {
       System.out.println("error input like for an example  '10' enter '+' enter '10'");
      }
      System.out.println("");
      System.out.println(player[1]+"\t solve the equation"); // tells other player to slove the equation 
      sum2 = input.nextDouble();
      if (sum2 == answer){// checks if the answer from the player is good or not if its good he/she gets 10 points if he/she gets it wrong gets no points and shows the right answer so the player learns from his/she mistakes
        scoreb = scoreb + 10.00;
        System.out.println("correct you got 10 points to your score");
        System.out.println("");
      } else{
        System.out.println("incorrect   you got no points the correct   answer was:"+"" + answer);
      }

Вы знаете, когда программа просит игрока ввести его математическое уравнение и выводит его, а затем продолжает программу и ожидает ввода пользователя

public void mathGame(){ // if player select    enter details 



    System.out.println("Please enter your equation please "+player[0]+" press enter for each number and mathematical symbol"); // tells the player 1 to input
          System.out.println("");
          System.out.println("such as for ex input a number or how many you like, then hit enter and input such as /*-+^ hit enter, then  input any  number one or how many you like ");
          String s=input.next();
          numA = Double.parseDouble(s); // numa and numb and operator is the aera of player to input he/she equation 
          operator = input.next().charAt(0);
          numB = input.nextDouble();

скажем, что входы игрока, такие как 10+10, вводят, но они не будут работать, поскольку они хранятся в numA, который является целым числом. Я хочу сделать сообщение об ошибке, в котором говорится, что вы не можете вводить, как эти 10+10, которые вы должны ввести как это 10 ввод + ввод 10 ввод, чтобы он мог работать, если игрок введет его правильно, он продолжит программу

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

1 ответ

Решение

Вот фрагмент вашего кода, на который я буду смотреть:

String s = input.next();
numA = Double.parseDouble(s);
operator = input.next().charAt(0);
numB = input.nextDouble();

if (/* Some condition */) {
    // Calculate answer
} else {
    System.out.println("error input like for an example  '10' enter '+' enter '10'");
}

Во-первых, пара мелочей: Java - это не C. Вам не нужно объявлять все переменные в начале блоков кода. numA, numB а также operator никогда не используются вне этого фрагмента кода, поэтому имеет смысл объявить их и здесь.

Вы также используете input.next() с Double.parseDouble() один раз input.nextDouble() в следующий раз. Придерживайтесь одного или другого, это облегчит отладку, если что-то не работает должным образом.

И, наконец, что произойдет, если кто-то входит 10 +1 0? Ошибка молча игнорируется, потому что 1 подбирается как часть operator Строка затем отбрасывается charAt(0), Более гибкий метод синтаксического анализа здесь был бы для получения всей String сначала, затем проверьте length == 1 перед звонком charAt(0),

double numA = input.nextDouble();

String operatorString = input.next();
char operator;
if (operatorString.length() == 1) {
    operator = operatorString.charAt(0);
} else {
    // Handle error
}

double numB = input.nextDouble();

if (/* Some condition */) {
    // Calculate answer
} else {
    System.out.println("error input like for an example  '10' enter '+' enter '10'");
}

Тогда на ваш вопрос: как мы обнаружим неверный ввод? Посмотрите на документацию для Scanner#nextDouble()(выделение мое):

public double nextDouble()

Сканирует следующий токен ввода как двойной.Этот метод броситInputMismatchExceptionесли следующий токен не может быть переведен в допустимое двойное значение. Если перевод выполнен успешно, сканер продвигается дальше соответствующего ввода.

Итак, мы знаем nextDouble() может обнаружить неверный вход для нас. Это делается в форме исключения, которое мы можем прослушивать (или ловить), используя try ... catch заявление:

try {
    double numA = input.nextDouble();
} catch (InputMismatchException e) {
    System.err.printf("Invalid input! Expected number, found '%s'.\n", input.next());
}

Мы могли бы расширить это и обернуть весь раздел кода в один try ... catch, но тогда пользователю придется начинать заново, если они допустят одну ошибку. Более удобное решение было бы следующим:

double numA;

while (1) {
    try {
        numA = input.nextDouble();
        break;
    } catch (InputMismatchException e) {
        System.err.printf("Invalid input, try again! Expected number, found '%s'.\n", input.next());
    }
}

Обратите внимание, что даже если вы его не распечатаете, input.next() необходимо предотвратить бесконечный цикл.

Теперь нам просто нужно сделать что-то подобное для operator:

char operator;

while (1) {
    String operatorString;

    try {
        operatorString = input.next();

        if (operatorString.length() != 1) {
            throw new InputMismatchException();
        }

        operator = operatorString.charAt(0);
        break;
    } catch (InputMismatchException e) {
        System.err.printf("Invalid input, try again! Expected character, found '%s'.\n", operatorString);
    }
}

Это кажется очень похожим на предыдущий фрагмент для числа - давайте попробуем преобразовать часть общего кода здесь в метод:

@FunctionalInterface
public interface ScannerGetter<T> {
    T apply() throws InputMismatchException;
}

public <T> T getValueFromScanner(ScannerGetter<T> getter, String type) {
    while(1) {
        try {
            return getter.apply();
        } catch (InputMismatchException e) {
            System.err.printf("Invalid input, try again! Expected %s.");
        }
    }
}

В этих нескольких строках много чего происходит. Первая часть объявляет функциональный интерфейс - это в основном пользовательский тип лямбда-функции. Мы вернемся к этому через минуту.

Сам метод (getValueFromScanner()) является общим методом. Это позволяет нам использовать один и тот же метод с разными типами вместо универсального параметра (Tбез дублирования.

Вот как вы могли бы использовать вышеупомянутый метод для получения ваших трех входных данных:

double numA = this.<Double>getValueFromScanner(() -> input.nextDouble(), "number");

char operator = this.<Char>getValueFromScanner(() -> {
    operatorString = input.next();

    if (operatorString.length() != 1) {
        throw new InputMismatchException();
    }

    return operatorString.charAt(0);
}, "operator");

double numB = this.<Double>getValueFromScanner(() -> input.nextDouble(), "number");

// Once your code gets here, all three variables will have valid values.
Другие вопросы по тегам