【问题标题】:Creating a nested for loop创建嵌套的 for 循环
【发布时间】:2013-10-27 22:33:14
【问题描述】:

因此,在尝试创建一个随机数生成器以提示用户不断猜测生成的数字直到他们猜对时,我遇到了一些问题。

在我尝试添加再次播放的选项之前,一切正常。问题是,如果他们猜错了数字,它会不断重复相同的错误消息,无论他们猜得太高、太低,还是输入无效。如果第一次猜对了号码,一切正常,并提示再次播放并完美运行。

问题是,我使用了 2 个 for 循环,因为当他们开始猜测时,我不想要:

“这个程序会生成一个从 0 到 100 的随机数,你必须猜。”

每次猜错时输出,我只希望在他们选择再次播放选项时输出,这就是我制作嵌套for循环的原因。但问题仍然存在,在显示相同答案的第一个错误猜测之后,内部 for 循环进入无限循环。

import javax.swing.JOptionPane;
import java.util.Random;
import javax.swing.UIManager;
import java.awt.*;

public class RandomNumberGuesser{
    public static void main(String[] args){
        UIManager m1=new UIManager();
        Color g = Color.gray;
        Color lg = g.brighter();
        m1.put("OptionPane.background", lg);
        m1.put("Panel.background", lg);

        int x;
        for(x = 1; true; x++){
        Random random = new Random();
        int randomNumber = random.nextInt(100);
        System.out.println(randomNumber);
        JOptionPane.showMessageDialog(null,
            "This program will generate a random number from 0 to 100 which you have to guess.",
            "Number Guesser",
            JOptionPane.INFORMATION_MESSAGE);
            String guess = JOptionPane.showInputDialog(null,
                "Guess a number.",
                "Guess",
                JOptionPane.QUESTION_MESSAGE);
                if(guess == null){
                    System.out.println("The user has terminated the program");
                    System.exit(0);
                    }
            int guess1 = Integer.parseInt(guess);

            int y;
            for(y = 1; true; y++){
                if(guess1 > 100 || guess1 < 0)
                JOptionPane.showMessageDialog(null,
                    "Guess is out of range!\nPlease enter valid input.",
                    "Invalid Input",
                    JOptionPane.WARNING_MESSAGE);

            else if(randomNumber > guess1)
                JOptionPane.showMessageDialog(null,
                    "You guessed too low.\nGuess again!",
                    "Your guess",
                    JOptionPane.INFORMATION_MESSAGE);

            else if(randomNumber < guess1)
                JOptionPane.showMessageDialog(null,
                    "You guessed too high.\nGuess again!",
                    "Your guess",
                    JOptionPane.INFORMATION_MESSAGE);

            else{
                JOptionPane.showMessageDialog(null,
                    "You guessed the number right!\nIt took you "+y+" attempt(s) to guess it.",
                    "Congratulations!",
                    JOptionPane.INFORMATION_MESSAGE);
                if (JOptionPane.showConfirmDialog(null, "Want to play again?", "Play again?",
                        JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {
                    System.out.println("Play again soon!");
                    System.exit(0);
                }
                else{
                    y = 0;
                    break;
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • for(x = 1; true; x++){ 让我哭泣,使用 while 来表示这种事情。如果你想退出,只需将一些变量设置为一个值,这样外部循环就知道它也必须为break(有更好的方法,但我认为最好慢慢开始)。
  • "Break" 只会让你跳出最里面的循环。您想创建一些标志来做您想做的事情(而不是简单的 "true" )。
  • @SJuan76 我是初学者。我刚刚开始学习一般的编程。那么你能举一个例子来说明它应该是什么样子吗?

标签: java if-statement for-loop joptionpane nested-loops


【解决方案1】:

你可以试试这个:

public class RandomNumberGuesser {
public static void main(String[] args) {
    // UIManager m1=new UIManager();
    Color g = Color.gray;
    Color lg = g.brighter();
    UIManager.put("OptionPane.background", lg);
    UIManager.put("Panel.background", lg);

    Random random = new Random();
    int attempts = 0; // Number of attempts

    int randomNumber = random.nextInt(100);
    System.out.println(randomNumber);

    // This outside the loop so is showed just ONE time
    JOptionPane.showMessageDialog(null,
                    "This program will generate a random number from 0 to 100 which you have to guess.", "Number Guesser", JOptionPane.INFORMATION_MESSAGE);

    while (true) {

        attempts++;

        String guess = JOptionPane.showInputDialog(null, "Guess a number.",
                "Guess", JOptionPane.QUESTION_MESSAGE);
        if (guess == null) {
            System.out.println("The user has terminated the program");
            System.exit(0);
        }
        int guess1 = Integer.parseInt(guess);

            if (guess1 > 100 || guess1 < 0)
                JOptionPane
                        .showMessageDialog(
                                null,
                                "Guess is out of range!\nPlease enter valid input.",
                                "Invalid Input",
                                JOptionPane.WARNING_MESSAGE);

            else if (randomNumber > guess1)
                JOptionPane.showMessageDialog(null,
                        "You guessed too low.\nGuess again!", "Your guess",
                        JOptionPane.INFORMATION_MESSAGE);

            else if (randomNumber < guess1)
                JOptionPane.showMessageDialog(null,
                        "You guessed too high.\nGuess again!",
                        "Your guess", JOptionPane.INFORMATION_MESSAGE);

            else {
                JOptionPane
                        .showMessageDialog(null,
                                "You guessed the number right!\nIt took you "
                                        + attempts + " attempt(s) to guess it.",
                                "Congratulations!",
                                JOptionPane.INFORMATION_MESSAGE);
                if (JOptionPane.showConfirmDialog(null,
                        "Want to play again?", "Play again?",
                        JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {
                    System.out.println("Play again soon!");
                    System.exit(0);
                } else {
                    randomNumber = random.nextInt(100);
                    System.out.println(randomNumber);
                    attempts = 0;
                }
            }
        }
    }
}

【讨论】:

  • 非常感谢。这实际上帮助了我很多,尤其是在理解 while 循环方面。再次感谢!哦,谢谢你指出我不需要 UIManager。我在另一个程序中忘记了那个部分。谢谢!
  • 您不需要该类的实例。但请注意我改变了这个:m1.put("OptionPane.background", lg); 这个:UIManager.put("OptionPane.background", lg);
【解决方案2】:

使用 while 循环。

这是一个如何保持循环直到满足某些条件的示例(在这种情况下,如果一个数字介于 1 和 100 之间):

Scanner keyboard = new Scanner(System.in);
    int number;
    boolean good = false;
    do
    {
      System.out.println("Enter a number between 1 and 100: ");
      number = keyboard.nextInt();
      if(number > 0 && number <= 100) {
        System.out.println("Good choice: \"" + number + "\"!");
        good = true;
      }
      else
        System.out.println("Invalid number: \"" + number + "\"! Please enter a number between 1 and 100!\n");
    }
    while (!good);
 } 

示例输入:

-1 -2 0 1

输出:

Enter a number between 1 and 100: 
Invalid number: "-1"! Please enter a number between 1 and 100!

Enter a number between 1 and 100: 
Invalid number: "-2"! Please enter a number between 1 and 100!

Enter a number between 1 and 100: 
Invalid number: "0"! Please enter a number between 1 and 100!

Enter a number between 1 and 100: 
Good choice: "1"!

【讨论】:

    【解决方案3】:

    当没有猜到正确的数字时,它进入了无限循环。我对你的代码做了一些修改,看看是否有帮助。

        package com.ananth.stackoverflow.help;
    
    import java.awt.Color;
    import java.util.Random;
    
    import javax.swing.JOptionPane;
    import javax.swing.UIManager;
    
    public class RandomNumberGuesser {
        public static void main(String[] args) {
            UIManager m1 = new UIManager();
            Color g = Color.gray;
            Color lg = g.brighter();
            m1.put("OptionPane.background", lg);
            m1.put("Panel.background", lg);
    
            int x;
            for (x = 1; true; x++) {
                Random random = new Random();
                int randomNumber = random.nextInt(100);
                System.out.println(randomNumber);
                JOptionPane.showMessageDialog(null,
                        "This program will generate a random number from 0 to 100 which you have to guess.", "Number Guesser",
                        JOptionPane.INFORMATION_MESSAGE);
                String guess = getInputFromUser();
                int guess1 = Integer.parseInt(guess);
    
                int y;
                for (y = 1; true; y++) {
                    if (guess1 > 100 || guess1 < 0) {
                        JOptionPane.showMessageDialog(null, "Guess is out of range!\nPlease enter valid input.",
                                "Invalid Input", JOptionPane.WARNING_MESSAGE);
                    } else if (randomNumber == guess1) {
                        JOptionPane.showMessageDialog(null, "You guessed the number right!\nIt took you " + y
                                + " attempt(s) to guess it.", "Congratulations!", JOptionPane.INFORMATION_MESSAGE);
                        if (JOptionPane.showConfirmDialog(null, "Want to play again?", "Play again?", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {
                            System.out.println("Play again soon!");
                            System.exit(0);
                        } else {
                            y = 0;
                            break;
                        }
                    } else if (randomNumber > guess1) {
                        JOptionPane.showMessageDialog(null, "You guessed too low.\nGuess again!", "Your guess",
                                JOptionPane.INFORMATION_MESSAGE);
                        guess = getInputFromUser();
                        guess1 = Integer.parseInt(guess);
                    } else if (randomNumber < guess1) {
                        JOptionPane.showMessageDialog(null, "You guessed too high.\nGuess again!", "Your guess",
                                JOptionPane.INFORMATION_MESSAGE);
                        guess = getInputFromUser();
                        guess1 = Integer.parseInt(guess);
                    }
                }
            }
        }
    
        private static String getInputFromUser() {
            String guess = "";
            guess = JOptionPane.showInputDialog(null, "Guess a number.", "Guess", JOptionPane.QUESTION_MESSAGE);
            if (guess == null) {
                System.out.println("The user has terminated the program");
                System.exit(0);
            }
            return guess;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-29
      • 1970-01-01
      • 2021-07-25
      • 2019-03-29
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多