繁体   English   中英

Java编号猜测游戏问题

[英]Java Number-Guessing Game Issue

我正在尝试在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上限设置为猜测。 同样,如果猜测太低,则需要将新的low设置为猜测。

问题不是永久循环。 这个程序完全按照你的要求行事:

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

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

希望有所帮助。

你用来改变计算机猜测的逻辑并不完全正确。 你想做什么(以及你想要做的事情)是二元搜索

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

一般来说,你应该跟踪“过低的最低猜测”和“过高的最高猜测”,下一个猜测应该在它们之间。

你应该动态地改变hilow ,而不是保持静态。 根据用户的响应,程序应更改hilow的值,并将其替换为当前中间递减或递增,然后通过平均新的hilow来设置新的中间值

这是我尝试过的,它似乎工作:

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");
        }
    }
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM