【问题标题】:Asking the user to think of, and write down, a number between 1 and 1,000,000 in java要求用户思考并写下 Java 中 1 到 1,000,000 之间的数字
【发布时间】:2015-07-13 20:36:17
【问题描述】:

大家好,我正在编写一个程序,要求用户思考并写下 1 到 1,000,000 之间的数字。

然后它会问诸如“它是否大于 500000?”之类的问题,并且用户回答“是”或“是”或“否”或“否”或“知道了!”现在我被困在这. 我不知道怎么让它问那个问题 这是我到目前为止得到的代码:

import javax.swing.JOptionPane;
public class Questions {

    public static void main(String[] args) {
       JOptionPane.showMessageDialog(null, Questions");
       String S = JOptionPane.showInputDialog("Enter a number between 1 and    1,000,000");
       int i = 1000000;
       if (i>500000){

    }
}

如何使用JOptionPane.showInputDialog 提出问题并获得答案? 任何帮助表示赞赏。

【问题讨论】:

  • 你的意思是怎么把"Enter a number between 1 and 1,000,000"改成"Is it greater than 500000?"
  • 我需要在 String S = JOptionPane.showInputDialog("Enter a number between 1 and 1,000,000"); 之后将 500000 放入一个变量中那是在问它是否大于 1,000,000
  • 如果你在让这个 GUI 工作时遇到问题,你可能想退后一步,写一个控制台应用程序,做同样的事情。
  • 用户是否真的提供了正确的答案,还是您依靠二分搜索最终缩小范围?

标签: java arrays boolean


【解决方案1】:

首先,我强烈建议在控制台中调试,直到你的逻辑完成,然后在 GUI 上工作。

您基本上是在尝试实现二进制搜索,计算机应该在log(N) 猜测中得到正确的答案。

这里有一些代码可以帮助您入门。 GUI 应该相当简单。阅读相应的 Javadocs。

try (Scanner k = new Scanner(System.in);) {
    String input;
    int lo = 0;
    int hi = 1000000; 
    int mid;
    while (true) {
        mid = (lo + hi) / 2;
        System.out.printf("Is it equal to %d?\n", mid);
        if (!input.equalsIgnoreCase("Got it!")) {
            break;
        } else {
            System.out.printf("Is it greater than %d?\n", mid); 
            input = k.nextLine();
            if (input.equalsIgnoreCase("yes")) {
                lo = mid;
            } else {
                hi = mid;
            }
        }
    } 
} catch (IOException e) {
    System.err.println(e.getMessage());
}

【讨论】:

  • 可以用 JOptionPane 代替扫描仪吗?
  • 是的,但您应该先让游戏本身运行起来。其他 cmets 对 GUI 的东西有很好的建议,这也很容易搜索。
【解决方案2】:

您可以使用showConfirmDialog() 提出是或否问题...这是一个示例,您需要更改这些值,因为这些值是硬编码的,但您应该能够弄清楚如何将其放入循环中并根据用户输入动态更改值:

int answer = JOptionPane.showConfirmDialog(null, "Is 500,000 your number?", "Question", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if(answer == 1)
{
    answer = JOptionPane.showConfirmDialog(null, "Is 500,000 less than your number?", "Question", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
}

这样用户不必输入“是”或“否”或“知道”,这将消除人为错误...

Yes - will return 0
No -  will return 1

第二个问题会根据他们的回答是或否,告诉你是否有低于或高于建议的数字...

【讨论】:

    【解决方案3】:

    首先您应该将 S 更改为一个整数,因为您要求用户输入一个整数。其次,假设程序应该尝试猜测数字,您将从 500,000 开始并不断猜测一半,直到得到输入的数字(看起来你得到了这部分)。所以这里有一个大纲(我不太确定 JOptipnPane 的确切语法是什么,但你可以找到输入和输出的命令):

    String YesOrNo = JOptionPane.ShowInputDialog ("is the number higher than 500,000? ")
    

    如果 YesOrNo.equalsIgnoreCase ("yes") 然后猜 750,00 下一个如果没有猜 250,000 下一个

    这是一个大纲,如果没有评论以获得进一步的帮助,你是否可以得到其余部分

    【讨论】:

    • 不知道为什么它发布了两个答案我在下面编辑了我的答案并发布了一个新答案...抱歉重复
    【解决方案4】:

    首先您应该将S 更改为int,因为您要求用户输入一个整数。其次,假设程序应该尝试猜测数字,您将从 500,000 开始并不断猜测一半,直到得到输入的数字(看起来你得到了这部分)。所以这里有一个大纲(我不太确定JOptipnPane 的确切语法是什么,但你可以找到输入和输出的命令):

    String yesOrNo = JOptionPane.ShowInputDialog("is the number higher than 500,000? ")
    

    如果yesOrNo.equalsIgnoreCase("yes"),那么接下来猜 750,00,如果没有,则猜 250,000 下一个

    这是一个大纲,看看你能不能得到其余的。如果没有评论以获得进一步的帮助。

    【讨论】:

    • OP 不希望用户输入整数。相反,用户应该输入一系列“是”/“否”的响应,这些响应绝对应该是字符串。
    • 是的,在他们输入一个数字(整数)后,程序将尝试找到它,然后它需要是或否作为字符串,就像我有字符串 S 一样。如果您查看 OP 要求的示例输入一个数字并将其存储在字符串 S 中。我是说将 S 更改为整数。然后在程序的稍后部分,我的 S 是一个字符串,正如您在我的回答中看到的那样。我会把我的 S 换成别的,这样更清楚。
    • 啊,我明白了。 OP的设计有一些问题。我从字面上理解了书面描述,程序不知道你的号码,但你不断地输入更高或更低的输入。留给 OP 来澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多