Создание вложенного цикла for

Поэтому, пытаясь создать генератор случайных чисел, который предлагал бы пользователю угадывать сгенерированное число до тех пор, пока он не угадает его, я столкнулся с некоторыми проблемами.

Все работало нормально, пока я не попытался добавить возможность снова играть. Проблема в том, что если они угадывают неправильное число, оно продолжает бесконечно повторять одно и то же сообщение об ошибке, независимо от того, угадали ли они слишком много, слишком мало или это был неверный ввод, постоянно. Если номер угадан с первого раза, все работает нормально, предлагает повторить игру и работает отлично.

Дело в том, что я использовал 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;
                    }
                }
            }
        }
    }
}

person Auxive    schedule 27.10.2013    source источник
comment
for(x = 1; true; x++){ заставляет меня плакать, используйте while для таких вещей. Если вы хотите выйти, просто присвойте некоторой переменной значение, чтобы внешний цикл знал, что он тоже должен break (есть лучшие способы, но я думаю, что лучше начинать медленно).   -  person SJuan76    schedule 28.10.2013
comment
Break только выводит вас из самой внутренней петли. Вы хотите создать несколько флагов, чтобы делать то, что вы хотите (вместо простого true).   -  person Floris    schedule 28.10.2013
comment
@ SJuan76 Я новичок. Я только начинаю изучать программирование в целом. Так не могли бы вы привести пример того, как это должно выглядеть?   -  person Auxive    schedule 28.10.2013


Ответы (3)


Вы можете попробовать это:

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;
                }
            }
        }
    }
}
person Christian    schedule 27.10.2013
comment
Большое спасибо. Это на самом деле очень помогло мне, особенно с пониманием цикла while. Спасибо еще раз! О, и спасибо, что указали, что мне не нужен UIManager. У меня было это в другой программе, и я забыл убрать эту часть. Спасибо! - person Auxive; 28.10.2013
comment
Вам не нужен экземпляр этого класса. Но обратите внимание, я изменил это: m1.put("OptionPane.background", lg); на это: UIManager.put("OptionPane.background", lg); - person Christian; 28.10.2013

Используйте цикл 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"!
person jrd1    schedule 27.10.2013

Это зацикливалось, когда правильное число не было угадано. Я внес некоторые изменения в ваш код, посмотрите, поможет ли это.

    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;
    }
}
person Ananth Chelladurai    schedule 27.10.2013