Бесконечный цикл do / while в Java.пожалуйста, порекомендуйте - PullRequest
0 голосов
/ 26 ноября 2018

Я новичок здесь и вообще кодировать.Я пытаюсь создать простую игру в угадайку, которая запрашивает у пользователя число и сравнивает его с числом, сгенерированным компьютером, от 1 до 100. Я пытался сделать так, чтобы игрок мог продолжать угадывать доони получают правильный ответ, а также отображают счетчик, чтобы сообщить игроку, сколько попыток угадать было сделано.Проблема в том, что программа не завершит работу после получения правильного ответа, и я не могу понять, что я делаю неправильно.Я вставлю весь код внизу для справки, но я чувствую, что проблема заключается в следующем утверждении в методе defineAnswer:

} else if (userAnswer == computerNumber) {
        message = "Correct"
                + "\nNumber of Guesses: " + count;
        success++;

Я пытаюсь использовать значениецелое число «успех» как условие завершения цикла do / while, но даже если я пытаюсь увеличить значение, цикл продолжается, как если бы значение непрерывно сбрасывалось.Если это так, я не вижу, где я ошибся.Опять же, я новичок в этом, но я был бы признателен за любой вклад.

import javax.swing.JOptionPane;

public class GuessingGame {

    public static void main(String[] args) {
        // generate a random number from 1 to 100
        int computerNumber = (int) (Math.random() * 100 + 1);
        // declare other variables
        int success = 0;
        int count = 0;
        // display the correct guess for testing purposes
        System.out.println("The correct guess would be " + computerNumber);
        // prompt user for a guess
        do {           
            count++;
            String response = JOptionPane.showInputDialog(null,
                    "Enter a guess between 1 and 100");
            int userAnswer = Integer.parseInt(response);
            // display result
            JOptionPane.showMessageDialog(null, determineGuess(userAnswer, computerNumber, success, count));
        } while (success == 0);

    }

    public static String determineGuess(int userAnswer, int computerNumber,int success, int count) {
        String message = null;        
        if (userAnswer <= 0 || userAnswer > 100) {
            message = "Invalid guess"
                    + "\nNumber of Guesses: " + count;
        } else if (userAnswer == computerNumber) {
            message = "Correct"
                    + "\nNumber of Guesses: " + count;
            success++;
        } else if (userAnswer > computerNumber) {
            message = "Incorrect, Too High"
                    + "\nNumber of Guesses: " + count;
        } else if (userAnswer < computerNumber) {
            message = "Incorrect, Too Low"
                    + "\nNumber of Guesses: " + count;
        }
        return message;
    }
}

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

В Java все передается по значению.

В этом случае передается примитив (int) методу, а затем изменяется его значение и ожидается, что это будет отражено в вызывающем методе.Java не работает так

public class SuccessTest {
public static void main(String[] args) {
    int success = 0;
    updateSuccess(success);
    System.out.println(success); //will print 0
}

private static void updateSuccess(int success) {
    //changing value of success here will not reflect in main method 
    success=2;
    System.out.println(success);//will print 2
}
}

Чтобы эта работа объявляла успех как переменную уровня класса

private static int success = 0;

, тогда нет необходимости передавать этот success метод defineGuess , теперь, если вы обновите значение success в defineGuess метод, он будет доступен в основном методе

0 голосов
/ 26 ноября 2018

Причина, по которой переменная success не обновляется в методе main, заключается в том, что она не имеет доступа к каким-либо изменениям переменной success метода determineGuess.Это две отдельные переменные в разных областях.

determineGuess получает success в качестве параметра метода int.В Java такие типы, как int, char и float, передаются по значению: это означает, что значение по существу копируется, когда оно передается методу или задается как переменная, поэтому при изменениископированное значение, исходное значение не изменяется.(на самом деле все типы передаются по значению , но содержимое объекта является ссылкой).

Существует несколько способов обновления переменной success для main метод, два из которых:

  1. Сделать success полем в классе, чтобы оно было доступно всем методам в классе.Поскольку вы делаете все это в main, сейчас вам понадобится success, чтобы быть статичным: private static int success = 0;.Лучшим способом может быть сделать все нестатичным, и main создать экземпляр объекта GuessingGame, а затем вызвать для него метод run.
  2. Вернуть значение из determineGuess, которое позволитВы знаете, к какой категории относится ответ: успех, неверный, слишком высокий или слишком низкий.Затем у вас будет второй метод, который использует этот вывод для выбора сообщения для отображения.Если main видит, что вывод успешен, он обновляет свою переменную success.Это может быть лучше, но более сложным.

Для этого простого примера я предлагаю вариант 1. Фактически, поскольку вы проверяете только один успех, переменная success может быть просто логическойзначение.Это сделает ваш код следующим (с изменениями):

import javax.swing.JOptionPane;

public class GuessingGame {
    // Determines whether the user has successfully guessed the number
    private static boolean success = false;

    public static void main(String[] args) {
        // Generate a random integer between 1 and 100 inclusive
        int computerNumber = (int) (Math.random() * 100 + 1);
        // Count the number of guesses that the user makes, to report it to them
        int count = 0;
        // FIXME: only for testing purposes, remove this
        System.out.println("The correct guess would be " + computerNumber);
        do {           
            count++;
            String response = JOptionPane.showInputDialog(null, "Enter a guess between 1 and 100");
            int userAnswer = Integer.parseInt(response);
            JOptionPane.showMessageDialog(null, determineGuess(userAnswer, computerNumber, count));
        } while (!success);
    }

    public static String determineGuess(int userAnswer, int computerNumber, int count) {        
        if (userAnswer <= 0 || userAnswer > 100) {
            return "Invalid guess\nNumber of Guesses: " + count;
        } else if (userAnswer == computerNumber) {
            success = true;
            return "Correct\nNumber of Guesses: " + count;
        } else if (userAnswer > computerNumber) {
            return "Incorrect, Too High\nNumber of Guesses: " + count;
        } else if (userAnswer < computerNumber) {
            return "Incorrect, Too Low\nNumber of Guesses: " + count;
        }
        return null;
    }
}

Если вы выберете вариант 2, у вас может быть enum GuessOutcome { INCORRECT, SUCCESS, TOO_LOW, TOO_HIGH }, который вы вернете из determineGuess.Тогда у вас будет метод getOutcomeMessage(GuessOutcome outcome) с switch (outcome) { ... } для выбора сообщения для отображения.Если outcome == GuessOutcome.SUCCESS, то success = true.В этой версии success может быть локальной переменной main.

0 голосов
/ 26 ноября 2018

Вы не обновляете значение успеха, и каждый раз, когда цикл запускается, он будет получать значение успеха как 0, и, следовательно, он вызывает бесконечный цикл.

int success = 0;
    int count = 0;
    // display the correct guess for testing purposes
    System.out.println("The correct guess would be " + computerNumber);
    // prompt user for a guess
    do {           
        count++;
        String response = JOptionPane.showInputDialog(null,
                "Enter a guess between 1 and 100");
        int userAnswer = Integer.parseInt(response);
        // display result
        JOptionPane.showMessageDialog(null, determineGuess(userAnswer, computerNumber, success, count));
success=1;
    } while (success == 0);
...