Игра в двоичное угадывание на Java

#java #arrays #binary

#java #массивы #двоичный

Вопрос:

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

Однако у меня возникают проблемы с порядком и длиной вывода.

Что мне нужно:

ГЕНЕРИРУЕТСЯ СЛУЧАЙНОЕ ЗНАЧЕНИЕ: 11

Двоичное число для угадывания: 1011

Отображение, показанное пользователю: ----

Отображение отображается после первого неправильного предположения: ---1

Отображение отображается после второго неправильного предположения: --11

Отображение отображается после третьего неправильного предположения: -011

Отображение отображается после четвертого неправильного предположения: 1011

Что я получаю:

ГЕНЕРИРУЕТСЯ СЛУЧАЙНОЕ ЗНАЧЕНИЕ: 11

Двоичное число для угадывания: 1011

Отображение, показанное пользователю: -------

Отображение отображается после первого неправильного предположения: ------0

Отображение отображается после второго неправильного предположения: -----00

Отображение отображается после третьего неправильного предположения: ----000

Отображение отображается после четвертого неправильного предположения: ---0000

Отображение отображается после пятого неправильного предположения: --10000

Дисплей отображается после шестого неправильного предположения: -010000

Дисплей отображается после седьмого неправильного предположения: 1010000

Мой код:

 Scanner scan = new Scanner(System.in);

        // Generating a random number between 1-16
        int randomNum = (int) (Math.random() * 16   1);
        int original = randomNum;
        System.out.println("Random num generated: "   randomNum);

        // Converting the random number to a binary number
        System.out.print("Random number in binary: ");
        int[] binary = new int[8];
        int originalBinary = 0;
        int index = 0;
        int count = 0;

        while (randomNum > 0) {
            binary[index  ] = randomNum % 2;
            randomNum /= 2;
        }
        for (int i = index - 1; i >= 0; i--) {
            count  ;

            System.out.print(binary[i]);
            originalBinary = binary[i];
        }
        System.out.println("n***********************************");

        // System.out.print("nPlease enter a guess: ");
        int guess = scan.nextInt();
        int digitsToReveal = 0;

        while (guess != original amp;amp; digitsToReveal != binary.length) {

            System.out.print("nPlease enter another number: ");
            guess = scan.nextInt();
            System.out.println(reveal(binary, digitsToReveal  ));

        }

    }

    public static String reveal(int[] arr, int reveal) {
        StringBuilder str = new StringBuilder();
        for (int i = 1; i < arr.length; i  ) {
            if (i >= arr.length - reveal) {
                str.append(arr[i]);
            } else {
                str.append("-");
            }

        }
        return str.toString();
    }
}



 

Ответ №1:

Обратите внимание, что ваш binary массив хранит биты целого числа в порядке, обратном тому, в котором вы его напечатали. То есть binary[0] это самый значимый бит. Например, для числа 13 (двоичный 1101) массив выглядит следующим образом:

 [1, 0, 1, 1, 0, 0, 0, 0]
 

При печати двоичной версии целого числа вы правильно считываете массив в обратном порядке:

 for (int i = index - 1; i >= 0; i--) {
    System.out.print(binary[i]);
}
 

Итак reveal , вы также должны прочитать массив в обратном порядке:

 public static String reveal(int[] arr, int reveal) {
    StringBuilder str = new StringBuilder();
    for (int i = 1; i < arr.length; i  ) {
        if (i >= arr.length - reveal) {
            // note the change here:
            str.append(arr[arr.length - i - 1]);
        } else {
            str.append("-");
        }

    }
    return str.toString();
}
 

Вместо i этого вы должны получить доступ arr.length - i - 1 .

Также обратите внимание, что массив длиной 5 может достаточно хранить числа от 1 до 16, вам не нужно использовать массив длиной 8.


Я не знаю, намеренно это или нет, но вы не раскрываете самый важный бит.

Ответ №2:

Из-за того, что вы храните двоичное число в обратном порядке к binary переменной массива

Число: 11

Двоичный: 1011

массив: [1, 1, 0, 1, 0, 0, 0, 0]

Я исправляю это, сохраняя его, наконец, в первый элемент двоичного массива, запуская index переменную с 7 помощью и index-- в цикле while. И я редактирую digitToReveals = 1 и перемещаю reveal вызывающий метод в первую строку в цикле while, это покажет число с момента первого неправильного угадывания.

 import java.util.Scanner; // Import the Scanner class

public class GuessFromBinary {

  public static void main(String[] args) {

    Scanner scan = new Scanner(System. in );

    // Generating a random number between 1-16
    int randomNum = (int)(Math.random() * 16   1);
    int original = randomNum;
    System.out.println("Random num generated: "   randomNum);

    // Converting the random number to a binary number
    System.out.print("Random number in binary: ");
    int[] binary = new int[8];
    int index = 7;

    while (randomNum > 0) {
      binary[index--] = randomNum % 2;
      randomNum /= 2;
    }

    for (int i = index   1; i < 8; i  ) {
      System.out.print(binary[i]);
    }

    System.out.println("n***********************************");

    System.out.print("nPlease enter a guess: ");
    int guess = scan.nextInt();

    int digitsToReveal = 1;

    while (guess != original amp;amp; digitsToReveal != binary.length) {
      System.out.println(reveal(binary, digitsToReveal  ));
      System.out.print("nPlease enter another number: ");
      guess = scan.nextInt();
    }

    if (guess == original) System.out.print("nYes!");
    else System.out.print("nNo luck :(");

  }

  public static String reveal(int[] arr, int reveal) {
    StringBuilder str = new StringBuilder();
    for (int i = 1; i < arr.length; i  ) {
      if (i >= arr.length - reveal) {
        str.append(arr[i]);
      } else {
        str.append("-");
      }

    }
    return str.toString();
  }
}
 

И я также настраиваю некоторые другие вещи (неиспользуемая переменная, взаимодействие с сообщениями, …). Вы даете игроку 8 раз угадать за раунд, если я правильно понял.