[英]Binary Guessing Game In 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 && 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();
}
}
请注意,您的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 的数组。
我不知道这是否是故意的,但你没有透露最重要的一点。
因为你是以相反的顺序存储二进制数到binary
数组变量
数量: 11
二进制: 1011
数组: [1, 1, 0, 1, 0, 0, 0, 0]
我通过以7
和index--
在 while 循环中开始index
变量,通过将其最后存储到二进制数组的第一个元素来解决此问题。 我编辑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 && 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 次猜测。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.