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

У меня проблема с моей программой, а не с кодом, это то, как я собираюсь это сделать, это запутанная часть, с которой я застрял.просто чтобы вы знали, что я базовый 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, который является int, я хочу сделать сообщение об ошибке, в котором говорится, что вы не можете вводить как 10 + 10, вы должны вводить как 10 enter + enter 10 enter, поэтому он сможет работать, если игрок правильно его введетпродолжит программу

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

1 Ответ

0 голосов
/ 08 декабря 2018

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

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() может обнаружить неправильный ввод для нас.Он делает это в форме исключения, которое мы можем прослушивать (или catch ), используя оператор 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...