【问题标题】:How do I find the users number using binary search如何使用二进制搜索找到用户编号
【发布时间】:2016-11-12 23:13:12
【问题描述】:

提示:玩家选择一个范围(最小值和最大值),然后在该范围内思考一个数字(无需在程序中输入数字)。游戏应该使用二分搜索系统地猜测玩家的号码。玩家应该在回合之间告诉计算机“太高”或“太低”或“正确”。该程序应继续运行,直到计算机得到答案,或检测到作弊(或确定知道答案)。在退出之前,计算机应该会说出它有多少“轮”(猜了多少次)。

问题:计算机第一次出错,用户声明过高或过低后,我无法重新设置上下限的值

import java.util.Scanner;

public class TestPractice {

    public static void main(String[] args) {
        System.out.println("Think of a number");
        Scanner scan = new Scanner(System.in);
        String x = null;
        String y = null;
        String i = null;
        //Get the input from the player
        System.out.println("Please your maximum value");

        if (scan.hasNext()) {
            x = scan.next();
        }

        System.out.println("Please input your min value");
        if (scan.hasNext()) {
            y = scan.next();
        }

        //Parse the input so its usuable in the array
        int max = Integer.parseInt(x);
        int min = Integer.parseInt(y);

        boolean numberguessed = true; 
        int numberofRounds = 0;

        while(numberguessed) {
            int midpoint = (max+min)/2;

            numberofRounds++;

            System.out.println("Is your number " + midpoint + " please say too low or too high or correct");
             if (scan.hasNext()) {
                 i = scan.next();
             }
             if (i.equalsIgnoreCase("too high")) {
                 min = midpoint;
             }
             if (i.equalsIgnoreCase("too low")) {
                 max = midpoint;
                 min = 0;
             }
             if (i.equalsIgnoreCase("correct")) {
                 System.out.println("the number of rounds in this game is" + numberofRounds);
                 break;
             }

        }

    }
}

【问题讨论】:

  • 您的意思是要让用户再次输入xy 最大值和最小值?在他们完成第一轮之后?
  • 还是不行?

标签: java binary-search


【解决方案1】:

您将需要使用 scan.nextLine() 而不是 scan.next() 来读取行中的所有内容,包括 space 字符,这就是为什么从不首先设置最大值和最小值的原因。

扫描器使用分隔符模式将其输入分解为标记,默认情况下匹配空格。

More info on scanner

要再次循环整个游戏,请查看do {} while(true); 迭代。

System.out.println("Think of a number");
Scanner scan = new Scanner(System.in);
String playAgain = "y";
String x = null;
String y = null;
String i = null;

do {
    // Get the input from the player
    System.out.println("Please your maximum value");

    if (scan.hasNext()) {
        x = scan.next();
    }

    System.out.println("Please input your min value");
    if (scan.hasNext()) {
        y = scan.next();
    }

    // Parse the input so its usuable in the array
    int max = Integer.parseInt(x);
    int min = Integer.parseInt(y);
    int midpoint = 0;
    boolean numberguessed = true;
    int numberofRounds = 0;

    while (numberguessed) {         
        midpoint = (max + min) / 2;
        numberofRounds++;
        System.out.println("Is your number " + midpoint
                + " please press (l) for too low or (h) for too high or (c) for correct");
        if (scan.hasNext()) {
            i = scan.nextLine();
        }
        System.out.println(i);
        if (i.equalsIgnoreCase("h")) {
            min = midpoint;
        } else if (i.equalsIgnoreCase("l")) {
            max = midpoint;
            min = 0;
        } else if (i.equalsIgnoreCase("c")) {
            System.out.println("the number of rounds in this game is"
                    + numberofRounds);
            break;
        }

    }
    System.out.println("Press y to play again");
    if (scan.hasNext()) {
        playAgain = scan.next();
    }
    System.out.println("Game over");
} while (playAgain.equalsIgnoreCase("y"));

More info on do while

建议使用简单的是/否答案,例如 h、l 和 c,而不是要求用户写一个单词。让我们知道。

【讨论】:

  • 我建议使用更惯用的while (true) do { } 而不是do { } while (true)。这不会让读者不确定断裂情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2020-03-01
相关资源
最近更新 更多