Как запретить пользователю повторно вводить один и тот же номер - PullRequest
0 голосов
/ 28 мая 2019

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

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"); 
    }
  }
}

Ответы [ 4 ]

1 голос
/ 28 мая 2019
  1. Создание массива с использованием ArrayList и присвоение ему имени (например, «input_numbers»)
ArrayList<Integer> entered_numbers = new ArrayList<Integer>();


2. Каждый раз, когда пользователь вводит число, проверьте с помощью contains(), есть ли номер в ArrayList.

Если это так, отобразите ваше сообщение (не number_of_guesses++)
Если это не так, добавьте его с помощью add() и продолжайте свои собственные проверки.

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
}


Другие предложили использовать HashSets, что лучше для производительности.
Сложность с использованием ArrayList - O (n), а HashSet - O (1).

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

Подробнее о сложности здесь: https://www.baeldung.com/java-collections-complexity

1 голос
/ 28 мая 2019

Ключевое слово для исследования: массивы .

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

В качестве альтернативы, вы можете использовать HashSet для хранения ранее введенных номеров. У наборов есть хороший метод contains () , который избегает повторного зацикливания массива. Но классы коллекций, такие как HashSet, немного продвинуты, и обычной практикой для новичков будет решение, основанное на массивах.

0 голосов
/ 28 мая 2019

Вы можете использовать набор для отслеживания номеров, отправленных пользователем, например,

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");


      }

   }

}
0 голосов
/ 28 мая 2019

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

Сохраните номер в буфере и проверьте, не использовался ли он ранее.

user_guess = kboard.nextInt();
if(user_guess == used_number){
   //WARN USER
    System.out.println("Warning");  
} else {
    used_number = user_guess;
}

Вы можете также увеличить вместо этого и предупредить после 3 повторов:

int used_number = 0;
int used_number_times = 0;
int limit = 3;

...

user_guess = kboard.nextInt();
if(user_guess == used_number){
    used_number_times++; 
} else {
    used_number = user_guess;
    used_number_times = 0;
}
if(used_number_times > limit){
    //WARN USER
    System.out.println("Warning");  
}

Или используйте HashSet:

int used_number = 0;
HashSet<Integer> set = new HashSet<>();
...


user_guess = kboard.nextInt();

if(!set.add(user_guess){
   //WARN USER
    System.out.println("Warning");  
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...