【问题标题】:binarySearch in Java, Mastermind GameJava中的binarySearch,策划游戏
【发布时间】:2012-12-03 22:35:59
【问题描述】:

现在,对于 Java 课程,我正在尝试构建一个类似于 Mastermind 的游戏。在这个游戏中,生成一个 4 位随机数,用户尝试猜测该数字。每次猜测时,计算机都会说明有多少正确的数字按正确的顺序排列,有多少正确的数字按错误的顺序排列。

由于某种原因,一切都取决于我对该程序的二进制搜索,这确实是该程序的核心。我花了几个小时来调整它,但我仍然无法得到它。有什么想法吗?

在这个例子中,我试图猜测 9935,但我意识到这不是一个随机数。

非常感谢!

编辑:当我运行这个程序并使用猜测“9875”时,它没有给我正确的结果。

我需要找到的猜测和结果是:

请输入四位数字:9874

正确但位置错误的位数:0

正确位置的正确位数:1

请输入四位数:9899

正确但位置错误的位数:1

正确位置的正确位数:1

请输入四位数字:9593

正确但位置错误的位数:3

正确位置的正确位数:1

请输入四位数:9935

正确但位置错误的位数:0

正确位置的正确位数:4

你是对的!

public class Mastermind {

public static void main(String[] args) {

    Random randomGenerator = new Random();
    Scanner input = new Scanner(System.in);

    int randomNumber = 9935;

    int[] randomArray = new int[4];

    int temp = randomNumber;
    for (int i = 3; i >= 0; i--){
        int n = temp%10;
        randomArray[i] = n;
        temp /= 10;
    }

    boolean found = false;

    while (found == false){

        System.out.print(Arrays.toString(randomArray));
        int[] guessArray = new int[4];
        System.out.print("Please enter a four-digit number: ");
        int guessTemp = input.nextInt();
        for (int i = 3; i >= 0; i--){
            int n = guessTemp%10;
            guessArray[i] = n;
            guessTemp /= 10;
        }

        if (Arrays.equals(randomArray, guessArray)){
            System.out.println("You are correct!");
            found = true;
        } else {

            int numberRightRight = 0;
            int numberRightWrong = 0;
            int indexFound = 0;
            for(int i = 0; i < guessArray.length; i ++){
                System.out.println(randomArray[i]);
                indexFound = Arrays.binarySearch(guessArray, randomArray[i]);
                System.out.println(indexFound);
                if (indexFound >= 0){
                    if(indexFound == i){
                        numberRightRight++;
                    } else {
                        numberRightWrong++;
                    }
                }
            }
           System.out.println("The number of correct digits but in the wrong place: " + numberRightWrong);
           System.out.println("The number of correct digits in the right place: " + numberRightRight);
        }   
    }
}

【问题讨论】:

  • 您能具体说明一下您的问题吗?
  • 我的第一个猜测是主数组没有排序
  • 我运行了它,它适用于该号码。请更具体地说明您遇到的问题
  • @SimonAndréForsberg- 请检查编辑。
  • @MadProgrammer - 它不应该被排序,它应该是一个随机产生的 4 位整数。这就是为什么我要寻找indexOf。

标签: java arrays binary-search


【解决方案1】:

如果您不需要使用Arrays.binarySearch(int[], int),您可以使用自己的简单查找方法来查找未排序的数组:

public static int findInArray(int[] array, int value) {
  for (int i = 0; i < array.length; i++) {
    if (array[i] == value) {
        return i;
    }
  }
  return -1;
}

现在不要调用Arrays.binarySearch(guessArray, randomArray[i]);,只需调用findInArray(guessArray, randomArray[i])

【讨论】:

  • 这效果好多了。这是为什么? binarySearch 不应该是最好的方法吗?此外,我看到的唯一问题是在第一次搜索中,使用9874 作为我的guessArray。我应该得到0 wrong, 1 right,但我却得到1 wrong, 1 right。有什么想法吗?
  • 或者只使用已经支持indexOf 操作的结构:List&lt;Integer&gt; 或字符串。实际上,String 在这里很有意义,因为数字只是标记,而不是任何有意义的数字。
  • @KeyferMathewson:有多个 cmets 解释了您为什么错误地使用 binarySearch。
  • @Dimitri,你说得对,但我想尽可能少地改变他的程序
  • @Dmitri 因为这是入门课,List&lt;Integer&gt;我们还没有真正学过,所以不知道怎么用。
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2014-12-01
  • 1970-01-01
  • 2014-01-21
  • 2018-10-15
相关资源
最近更新 更多