2013-10-27 2 views
0

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

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

Дело в том, я использовал 2 для петель, потому что, когда они начинают гадать, я не хочу:

«Эта программа будет генерировать случайное число от 0 до 100, которое вы должны угадать.»

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

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; 
        } 
       } 
      } 
     } 
    } 
} 
+1

'for (x = 1; true; x ++) {' заставляет меня плакать, используйте 'while' для такого рода вещей. Если вы хотите выйти, просто установите некоторую переменную в значение, чтобы внешний контур знал, что он тоже должен «ломаться» (есть лучшие способы, но я думаю, что лучше начинать медленно). – SJuan76

+0

«Перерыв» выводит вас из самой внутренней петли. Вы хотите создать несколько флагов, чтобы делать то, что вы хотите сделать (вместо простого «истинного»). – Floris

+0

@ SJuan76 Я новичок. Я просто начинаю изучать программирование в целом. Так вы могли бы привести пример того, как он должен выглядеть? – Auxive

ответ

0

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

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; 
       } 
      } 
     } 
    } 
} 
+0

Большое вам спасибо. Это действительно помогло мне совсем немного, особенно с пониманием цикла while. Еще раз спасибо! О, и спасибо, что указали, что мне не нужен UIManager. У меня было это в другой программе, и я забыл принять эту часть. Благодаря! – Auxive

+0

Вам не нужен экземпляр этого класса. Но заметьте, я изменил это: 'm1.put (" OptionPane.background ", lg);' для этого: 'UIManager.put (" OptionPane.background ", lg);' – Christian

0

Используйте цикл 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); 
} 

Sample вход:

-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"! 
0

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

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; 
    } 
} 
Смежные вопросы