#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 раз угадать за раунд, если я правильно понял.