0

我是新来的,一般都是编码的。我想要完成的是创建一个简单的猜谜游戏,提示用户输入一个数字,并将该数字与计算机生成的 1 到 100 之间的数字进行核对。我试图让它让玩家可以继续猜测,直到他们得到正确的答案,并显示一个计数器让玩家知道他们做了多少次猜测尝试。问题是,给出正确答案后程序不会终止,我不知道我做错了什么。我将整个代码粘贴在底部以供参考,但我觉得问题出在“determineAnswer”方法中的以下语句中:

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

3 回答 3

2

您不更新成功的值,每次循环运行时,它都会将成功值设为 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);
于 2018-11-26T09:01:51.293 回答
1

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

那么不需要通过这个成功确定Guess方法,现在如果你在确定猜测方法中更新成功的值,它将在主方法中可用

于 2018-11-26T09:26:27.100 回答
0

success变量未在方法中更新的原因main是它无权访问对determineGuess方法success变量的任何更改。它们是不同范围内的两个独立变量。

determineGuesssuccess作为int方法参数接收。在 Java 中intchar和等类型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)带有 a 的方法switch (outcome) { ... }来选择要显示的消息。如果outcome == GuessOutcome.SUCCESS,那么success = true。在这个版本中,success可以是一个局部变量main

于 2018-11-26T10:10:14.597 回答