简体   繁体   中英

Java Guessing Game infinite loop

I'm having an issue with my code where the program will not play again, but also will not end.

The code continues to loop in the inner while loop after a win or too many guesses.

Here is my code:

/**
 * This program will prompt the user to guess a secret number
 * This number will is between 1 and N, where N is a postive number
 *
 * @author: Perry Chapman
*/

import java.util.Scanner;

public class SecretNumber2
{
    public static void main( String [] args )
    {
        int N;
        int randomNumber;    
        int guess;
        int tries, maxTries;

        boolean win = false;
        boolean playing = true;
        int playAgain = 1;
        tries = 0;

        while(playing == true)
        { 
            Scanner input = new Scanner( System.in );

            System.out.println( "This is a guessing game." );
            System.out.println( "What is the max number of tries: ");
            maxTries = input.nextInt();
            System.out.println( "Enter a value between 1 and 1000: " );
            N = input.nextInt();

            randomNumber = (int)(N * Math.random()) + 1;

            while (win == false)
            {
                System.out.println( "Enter your guess: " );                      
                guess = input.nextInt();
                tries++;

                if (guess == randomNumber) 
                {  
                    System.out.println( "Congratulations! The number of guesses it took you was " + tries );
                    win = true;
                    System.out.println("Would you like to play again? \n (1)Yes or (2)No: ");
                    playAgain = input.nextInt();

                    if(playAgain == 1) {
                        playing = true;
                    }

                    else if (playAgain == 2) {
                        playing = false;
                    }
                    tries = 0;
                }

                else if(guess < randomNumber)
                    System.out.println( "Too low, guess again." );

                else if(guess > randomNumber)                        
                    System.out.println( "Too high, guess again." );

                else if(tries == maxTries)
                {
                    System.out.println("You have exceeded the max number of tries. \nYou lose.");
                    System.out.println("\nWould you like to play again?\n (1)Yes or (2)No: ");
                    playAgain = input.nextInt();

                    if(playAgain == 1) {
                      playing = true;
                    }

                    else if(playAgain == 2) {
                      playing = false;
                    }

                    tries = 0;
                }
            }
        }
    }
}

Andrew is right, in order to loop the condition need to be true.The if else statement need to be in the right order. Here is a fix, I hope it will help.

public static void main(String[] args) {
    int N;
    int randomNumber;
    int guess;
    int tries, maxTries;

    boolean lose;
    boolean playing = true;
    int playAgain;
    tries = 0;

    while (playing) {
        Scanner input = new Scanner(System.in);

        System.out.println("This is a guessing game.");
        System.out.println("What is the max number of tries: ");
        maxTries = input.nextInt();
        System.out.println("Enter a value between 1 and 1000: ");
        N = input.nextInt();

        randomNumber = (int) (N * Math.random()) + 1;
        lose = true;

        while (lose) {
            System.out.println("Enter your guess: ");
            guess = input.nextInt();
            tries++;

            if (guess == randomNumber) {
                System.out.println("Congratulations! The number of guesses it took you was " + tries);
                lose = false;
                System.out.println("Would you like to play again? \n (1)Yes or (2)No: ");
                playAgain = input.nextInt();

                if (playAgain == 1) {
                    playing = true;
                } else if (playAgain == 2) {
                    playing = false;
                }
                tries = 0;
            } else if (tries == maxTries) {
                System.out.println("You have exceeded the max number of tries. \nYou lose.");
                System.out.println("\nWould you like to play again?\n (1)Yes or (2)No: ");
                playAgain = input.nextInt();

                if (playAgain == 1) {
                    playing = true;
                } else if (playAgain == 2) {
                    playing = false;
                }
                lose = false;
                tries = 0;
            } else if (guess < randomNumber) {
                System.out.println("Too low, guess again.");
            } else if (guess > randomNumber) {
                System.out.println("Too high, guess again.");
            }
        }
    }
}

I think you have two issues.

The first is that after successfully guessing the number you never set win back to false. So you won't ever enter the inner while loop a second time.

The second is the ordering of the if/else if statements, there is never a scenario where a guess can reach the final else if. Every situation will validate as true in one of the previous three ifs.

 /**
   * This program will prompt the user to guess a secret number
   * This number will is between 1 and N, where N is a postive number
  *
 * @author: Perry C
*/

 import java.util.Scanner;

 public class SecretNumber
 {
 public static void main( String [] args )
 {
    int N;    
    int guess;
    int playAgain;
    int tries;
    int maxTries;

    playAgain = 1;
    tries = 0;

    Scanner input = new Scanner( System.in );

    while(playAgain == 1)
      { 
      boolean win = false;
      System.out.println( "This is a guessing game." );
      System.out.println( "How many guesses would you like?" );
      maxTries = input.nextInt();
      System.out.println( "Enter a value between 1 and 1000: " );
      N = input.nextInt();

      int randomNumber = (int)(N * Math.random()) + 1;

    while (win == false) 
      {
        System.out.println( "Enter your guess: " );                      
        guess = input.nextInt();
        tries++;

        if(guess == randomNumber) 
        {  
          System.out.println( "Congratulations! The number of guesses it took you was \t" + tries );
          win = true;
          System.out.println( "Would you like to play again(1 or 2):" );
          playAgain = input.nextInt();
          tries = 0;
        }

        else if(guess < randomNumber)
          System.out.println( "Too low, guess again." );

        else if(guess > randomNumber)                        
          System.out.println( "Too high, guess again." );

        if(tries == maxTries)
        {
          System.out.println( "You have exceeded the max number of tries. \n You lose." );
          System.out.println( "Would you like to play again(1 or 2):" );
          playAgain = input.nextInt();
          tries = 0;
          win = true;
        }
      }
    }
}
}

Found the issue, thought I would post the answer in case anyone else might stumble on this thread! Thanks for the help!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM