java中的二进制猜测游戏

2ic8powd  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(297)

我试图创建一个猜谜游戏,从用户的输入。我的问题是,当用户猜错时,必须显示二进制数的正确数字,以此类推。
但是,我对输出的顺序和长度有问题。
我需要的是:
生成的随机值: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();
    }
}
krcsximq

krcsximq1#

请注意,您的 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的数组。
我不知道这是不是有意的,但你没有透露最重要的一点。

5jvtdoz2

5jvtdoz22#

因为你是按相反的顺序存储二进制数的 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 && 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次机会去猜。

相关问题