Причина, по которой переменная success
не обновляется в методе main
, заключается в том, что она не имеет доступа к каким-либо изменениям переменной success
метода determineGuess
.Это две отдельные переменные в разных областях.
determineGuess
получает success
в качестве параметра метода int
.В Java такие типы, как int
, char
и float
, передаются по значению: это означает, что значение по существу копируется, когда оно передается методу или задается как переменная, поэтому при изменениископированное значение, исходное значение не изменяется.(на самом деле все типы передаются по значению , но содержимое объекта является ссылкой).
Существует несколько способов обновления переменной success
для main
метод, два из которых:
- Сделать
success
полем в классе, чтобы оно было доступно всем методам в классе.Поскольку вы делаете все это в main
, сейчас вам понадобится success
, чтобы быть статичным: private static int success = 0;
.Лучшим способом может быть сделать все нестатичным, и main
создать экземпляр объекта GuessingGame
, а затем вызвать для него метод run
. - Вернуть значение из
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
.