Как рассчитать среднее количество догадок, необходимых для угадывания числа, несколько раз - PullRequest
0 голосов
/ 24 сентября 2019

Итак, мы делаем HiLo на нашем уроке java, и в инструкциях сказано, что игрок должен иметь возможность играть более одного раза.Итак, я сделал это, а также вычислил среднее число догадок, которое потребовалось, чтобы угадать количество ВСЕХ игр, я понятия не имею, как это сделать, поскольку после перезапуска игры количество угаданий сбрасывается?

IУ меня та же проблема со временем (Точно то же самое, среднее время, необходимое для угадывания числа)

Я пытался писать догадки ++, но я не знаю, как "хранить" количество догадоквзял для каждой игры и понятия не имею, как это сделать

public class HiLo{

   //Globala-Variabler
   static int tal = 0;
   static int totaltSpelade = 0;
   static int gissning = 1;
   static int antalGissningar = 0;


   public static void main(String args[]) throws InterruptedException {
      // val slingan


      int val = Kbd.readInt("\nKlicka 1 för 1-10\nKlicka 2 för 1-100\nKlicka 3 för 1-1000");


      if (val == 1){
         tal = (int) (Math.random() * 10)+1;
      }


      else if (val == 2){
         tal = (int) (Math.random() * 100)+1;
      }


      else if (val ==3){
         tal = (int) (Math.random() * 1000)+1;
      }
      else{
         Kbd.clearScreen();
         System.out.println("\nFelinmatning!");
         main(null);
      }


      // tid och gissnings slinga
      int gissningar = Kbd.readInt("\nBörja gissa!");
      long startTid = System.currentTimeMillis();


      slinga();


      //stop tid
      System.out.println("\nGrattis!\nDu gissade rätt tal på " + antalGissningar + " försök!");
      long stopTid = System.currentTimeMillis();
      long tid = stopTid-startTid;
      System.out.print("Det tog dig! " + (tid/1000) + "s");
      totaltSpelade++;


      int avsluta = Kbd.readInt("\nKlicka 1 för att köra igen\nKlicka 2 för att avsluta");
      if (avsluta == 1){
         //Kbd.clearScreen();
         main(null);
      }


      else{
         System.out.println("\nHejdå!, Det tog dig i snitt " +
         // THIS IS WHERE I WANT TO PRINT OUT THE AVERAGE NUMBER OF GUESSES OF ALL GAMES
         (antalGissningar/totaltSpelade) + " gissningar per gång.");

         System.out.println("\nOch i snitt " + (tid/1000) + " s");
         //Kbd.clearScreen();
         System.exit(0);
      }
   }

   // val slinga metod

   public static void slinga(){


      while (gissning != tal) {
         antalGissningar++;
         if (gissning > tal) {
            gissning = Kbd.readInt("\nLägre! ");
         } else if (gissning < tal) {
            gissning = Kbd.readInt("\nHögre! ");
         }
      }
   }
}

1 Ответ

0 голосов
/ 25 сентября 2019

Я создал игру с угадыванием чисел.Цель - показать вам, как использовать вложенный цикл вместо рекурсивного вызова метода main.Это может не соответствовать всем вашим требованиям.Есть много вещей, которые вы можете добавить, например, рассчитать средние догадки на основе уровня сложности.Дайте подсказки, убедитесь, что пользователь вводит число в диапазоне уровня сложности и т. Д. *

Я объяснил логику в комментариях.

public static void main(String args[]) {
   String playAgain = "yes";
   ArrayList<Integer> totalGuesses = new ArrayList<>(); // Keep track of total guesses in all rounds
   int round = 1; // Round number
   do {
      // Prints greeting
      System.out.println("Welcome to High Low game.\nPlease enter difficulty level.");
      System.out.println("Level 1: Easy Range [1-10]");
      System.out.println("Level 2: Medium Range [1-100]");
      System.out.println("Level 3: Hard Range [1-1000]");
      System.out.print("\nEnter Level Number: ");

      Scanner scanner = new Scanner(System.in);
      int difficultyLevel = scanner.nextInt();
      // Making sure that user inputs difficulty level within a certain range
      while (!(difficultyLevel > 0 && difficultyLevel <= 3)) {
         System.out.print("Please enter correct difficulty level: ");
         difficultyLevel = scanner.nextInt();
      }
      // Displays selected difficulty level
      System.out.println("Difficulty level is set to " + difficultyLevel + "\n");
      int theNumber = 0;

      if (difficultyLevel == 1) { // This part is copied from your code
         theNumber = (int) (Math.random() * 10) + 1;
      } else if (difficultyLevel == 2) {
         theNumber = (int) (Math.random() * 100) + 1;
      } else if (difficultyLevel == 3) {
         theNumber = (int) (Math.random() * 1000) + 1;
      }

      boolean hasGuessed = false;
      int numberOfGuesses = 0; // keep track of number of guesses in each round
      int guessedNumber;
      ArrayList<Integer> alreadyGuessed = new ArrayList<>();
      while (!hasGuessed) { // While user has not guessed (This while loop is nested in do while)
         System.out.print("Please guess the number: ");
         guessedNumber = scanner.nextInt();
         if (theNumber == guessedNumber) { // If user guesses correctly
            hasGuessed = true;
            numberOfGuesses++;
            System.out.printf("\nCongratulations you have guessed the number on your number %d attempt",
            numberOfGuesses);
            totalGuesses.add(new Integer(numberOfGuesses));
         } else { // If guess is incorrect
            numberOfGuesses++;
            alreadyGuessed.add(new Integer(guessedNumber));
            if (guessedNumber > theNumber) {
               System.out.println("\nSorry but the number you are trying to guess is lower that your guess");
            } else {
               System.out.println("\nSorry but the number you are trying to guess is higher that your guess");
            }
            // Prints already guessed so user doesn't enter same value. You can program so it doesn't accept same number by checking the guessedNumber againstalreadyGuessed
            System.out.println("Already guessed numbers: " + alreadyGuessed.toString());
         }
      }
      // when hasGuessed is true the while loop exits
      System.out.print("\nDo you want to play again? Enter yes or no: ");
      playAgain = scanner.next(); // Asking user if they want another round
      if (playAgain.equalsIgnoreCase("yes")) {
         System.out.println("\nRound " + ++round); //Prints round number plus adds empty line between each round
      }
   } while (playAgain.equalsIgnoreCase("yes"));
   // If player enters anything besides yes it exits do while loop
   double averageGuesses = calculateAverage(totalGuesses); // Calculates average guesses
   System.out.println("\nYour average number of guesses are " + averageGuesses);
}

/*
 * Adds all elements in array and divides it by arraylist size
 */
private static double calculateAverage(ArrayList<Integer> list) {
   Integer sum = 0;
   if (!list.isEmpty()) {
      // Iterate through list and stores each item in a variable (item)
      for (Integer item : list) { 
         sum += item; // short form of sum = sum + item;
      }
      return sum.doubleValue() / list.size();
   }
   return sum;
}

Пример вывода:

Welcome to High Low game.
Please enter difficulty level.
Level 1: Easy Range [1-10]
Level 2: Medium Range [1-100]
Level 3: Hard Range [1-1000]

Enter Level Number: 1
Difficulty level is set to 1

Please guess the number: 6

Sorry but the number you are trying to guess is lower that your guess
Already guessed numbers: [6]
Please guess the number: 2

Sorry but the number you are trying to guess is higher that your guess
Already guessed numbers: [6, 2]
Please guess the number: 5

Congratulations you have guessed the number on your number 3 attempt
Do you want to play again? Enter yes or no: yes

Round 2
Welcome to High Low game.
Please enter difficulty level.
Level 1: Easy Range [1-10]
Level 2: Medium Range [1-100]
Level 3: Hard Range [1-1000]

Enter Level Number: 1
Difficulty level is set to 1

Please guess the number: 1

Congratulations you have guessed the number on your number 1 attempt
Do you want to play again? Enter yes or no: no

Your average number of guesses are 2.0
...