Java数字猜谜游戏问题

Java数字猜谜游戏问题,java,loops,Java,Loops,我正在尝试用Java构建一个数字猜测游戏,它不同于通常的游戏,在游戏中,你猜测数字,程序会告诉你数字是高还是低。我正在尝试建立一个程序,程序猜测数字,你说它是高还是低,直到程序找到你选择的数字 我对“if”语句有一个问题,其中程序猜测的数字太低 具体问题如下: if (hilow.equals("l")) { middle = middle * 2; System.out.println(middle); n

我正在尝试用Java构建一个数字猜测游戏,它不同于通常的游戏,在游戏中,你猜测数字,程序会告诉你数字是高还是低。我正在尝试建立一个程序,程序猜测数字,你说它是高还是低,直到程序找到你选择的数字

我对“if”语句有一个问题,其中程序猜测的数字太低

具体问题如下:

if (hilow.equals("l"))
        {
            middle = middle * 2;
            System.out.println(middle);
            numbGuesses++;
        }
到目前为止,整个计划如下:

import java.util.*;

public class NumbGuess
{
    public static void main(String args[])
    {
        int numbGuesses = 0;
        boolean win = false;
        int hi = 1000000;
        int low = 0;
        Scanner input = new Scanner(System.in);
        int middle = hi / 2;
        System.out.println(middle);


    while (win == false)
    {
        String hilow = input.nextLine();

        if (hilow.equals("h"))
        {
            middle = middle / 2;
            System.out.println(middle);
            numbGuesses++;
        }

        if (hilow.equals("l"))
        {
            middle = middle * 2;
            System.out.println(middle);
            numbGuesses++;
        }

        if (hilow.equals("y"))
        {
            win = true;
            System.out.println("It took: " + numbGuesses + " guesses");
        }
    }
}
}
当数字过低时,我遇到的问题是一个永久循环:


我想我需要改变中间层的操作方式以获得工作结果。

您的逻辑有缺陷。当数字太低时,你不应该只乘以2,当数字太高时,你不应该只除以2


新猜想应该在范围的中间。如果您的第一次猜测是500000,并且用户说它太低,则该数字介于500000和最大数字(1000000)之间,因此新的猜测应该是
(1000000-500000)/2=750000
,而不是
500000*2
。如果第一次猜测过高,则该数字介于最小值(0)和500000之间,因此下一次猜测应该是
(500000-0)/2=250000

您的问题在于If语句的高和低。每次进行猜测时,您都需要调整边界,例如,如果猜测太高,则需要将新的
high
bound设置为猜测。同样,如果猜测太低,则需要将新的
low
绑定设置为猜测。

问题不是一个永久循环。此程序正按照您的要求执行:

它说的是500000,你说的是用它除以2(=250000)。然后,你说让它乘以2(=500000)。到目前为止

问题在于你的逻辑。当程序接收到信息时,您应该正确设置限制(
hi
low
)。例如,如果程序猜测500000,而你说它太高,那么现在你的限制在1到499999(=500000-1)之间。如果它太低,现在您的限制在500001(=500000+1)和1000000之间,每次您使用
hi
low
(hi+low)/2
)重新计算
中间的


希望这有帮助。

您用来改变计算机猜测的逻辑不太正确。您想要做的(以及看起来您正在尝试做的)是一个二进制搜索

在你的例子中,50000是太高,25000是太低,所以下一个猜测不应该是25000倍,它应该在50000和25000的中间,或者像37500一样。


一般来说,您应该跟踪“最低猜测过高”和“最高猜测过低”,下一次猜测应该介于两者之间。

您应该动态更改hilow,而不是保持它们静止。根据用户的响应,程序应更改hilow的值,并将其分别替换为当前middle递减或递增的值,然后通过平均新hilow来设置新的middle

以下是我尝试过的,并且似乎有效:

import java.util.*;

public class NumbGuess
{
    public static void main(String args[])
    {
        int numbGuesses = 0;
        boolean win = false;
        int hi = 1000000;
        int low = 0;
        Scanner input = new Scanner(System.in);
        int middle = hi / 2;
        System.out.println(middle);


    while (win == false)
    {
        String hilow = input.nextLine();

        if (hilow.equals("h"))
        {
            hi = middle - 1;
            middle = (low + hi) / 2;

            System.out.println(middle);
            numbGuesses++;
        }

        if (hilow.equals("l"))
        {
            low = middle + 1;
            middle = (low + hi) / 2;

            System.out.println(middle);
            numbGuesses++;
        }

        if (hilow.equals("y"))
        {
            win = true;
            System.out.println("It took: " + numbGuesses + " guesses");
        }
    }
}
}

好的,谢谢。我是新来的,这是我的小宠物项目。你的回答很有帮助。