rxeqz
rxeqz

Reputation: 13

How to prevent the user from repetitively inputting same number

I am creating a program in java where the user has to guess a random number generated by the computer, The user gets 20 tries in total to guess the number,if the user enters the same number repeatedly it should show an error message and no count as one of their guesses but am unsure how to do this. For example if the users first guess is 5 and they guess 5 again an error message should appear saying "You have already entered this number

package guessinggame2;
import java.util.Scanner;

public class GuessingGame2 {

  static Scanner kboard = new Scanner(System.in);

  public static void main(String args[]) // start of main 
  {
    System.out.println("Welcome to the guessing game, the computer will 
    generate a random number that you have to guess, good luck!");

    int secret_number = 0;
    int number_of_guesses = 0;
    Scanner input = new Scanner(System.in);
    int user_guess;
    int used_number = 0;

    secret_number = (int)(Math.random()*100) + 1;
    System.out.println("The computer has generated it's number");

    for(int i=0; i<20;i++) {

      System.out.println("Please make your guess");
      user_guess = kboard.nextInt();
      number_of_guesses++;

      if (user_guess == secret_number)
      {
        System.out.println("Your guess is correct it took you " + 
        number_of_guesses + " guesses");
      }

      else if  (user_guess < secret_number)
      {
        System.out.println("Your guess is too low try again");
      }

      else if (user_guess > secret_number)
      {
        System.out.println("Your guess is too high try again");
      }

      System.out.println (20 - number_of_guesses + " Guesses remaining"); 
    }
  }
}

Upvotes: 0

Views: 361

Answers (3)

marcoverbeek
marcoverbeek

Reputation: 74

  1. Create an array using ArrayList and give it a name (ex. 'entered_numbers')
ArrayList<Integer> entered_numbers = new ArrayList<Integer>();


2. Every time the user inputs a number, check using contains() whether or not the number is in the ArrayList.

If it is, display your message (don't number_of_guesses++)
If it isn't, add it using add() and continue your own checks.

if(entered_numbers.contains(user_guess)) {
    System.out.println("You have already entered this number");
    continue;
} else {
    entered_numbers.add(user_guess);
    // Check if == secret number,
    // Check if < secret number,
    // Check if > secret number
}


Others have suggested using HashSets which is better for performance.
Complexity using ArrayList is O(n) while HashSet is O(1).

I opted for an easier approach using ArrayList, and it doesn't affect performance too much because you're not going to store a lot of data inside that ArrayList.

See more about complexity here: https://www.baeldung.com/java-collections-complexity

Upvotes: 1

GhostCat
GhostCat

Reputation: 140427

The keyword to research: arrays.

Simply store all numbers from your user into such an array. Then you can iterate that array each time when a new number is given. When you find that number in that array you can print the error message.

Alternatively, you can use a HashSet to store previously entered numbers. Sets have a nice method contains() which avoids the repeated looping of an array. But the collection classes such as HashSet are a bit advanced, and the normal practice for newbies would be a solution based on arrays.

Upvotes: 1

AmitD
AmitD

Reputation: 94

You can use a set to keep track of numbers submitted by user e.g.

public class GuessingGame2 {

   static Scanner kboard = new Scanner(System.in);


   public static void main(String args[]) // start of main
   {

      System.out.println("Welcome to the guessing game, the computer will generate a random number that you have to guess, good luck!");

      int secret_number = 0;
      int number_of_guesses = 0;
      Scanner input = new Scanner(System.in);
      int user_guess;
      int used_number = 0;
      HashSet<Integer> user_inputs = new HashSet<>();

      secret_number = (int) (Math.random() * 100) + 1;
      System.out.println("The computer has generated it's number");

      for (int i = 0; i < 20; i++) {

         System.out.println("Please make your guess");
         user_guess = kboard.nextInt();
         if (!user_inputs.add(user_guess)) {
            System.out.println("Please provide another input");
            continue;
         }
         number_of_guesses++;

         if (user_guess == secret_number) {
            System.out.println("Your guess is correct it took you " +
                  number_of_guesses + " guesses");
         } else if (user_guess < secret_number) {
            System.out.println("Your guess is too low try again");
         } else if (user_guess > secret_number) {
            System.out.println("Your guess is too high try again");
         }

         System.out.println(20 - number_of_guesses + " Guesses remaining");


      }

   }

}

Upvotes: 0

Related Questions