我正在尝试在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");
}
}
}
}
我遇到的问题是数字太低时永久循环:
我认为我需要改变中间操作以获得工作结果。
答案 0 :(得分:2)
你的逻辑是有缺陷的。当数字太低时,你不应该乘以2,而当数字太高时,你不应该除以2。
新猜测应该在范围的中间。如果您的第一个猜测是500000,并且用户说它太低,则该数字介于500000和最大数字(1000000)之间,因此新猜测应为(1000000-500000)/2=750000
,而不是500000*2
。如果第一个猜测太高,则该数字介于最小数字(0)和500000之间,因此下一个猜测应为(500000-0)/2=250000
。
答案 1 :(得分:1)
你的问题在于高if
语句。您需要在每次猜测时调整边界,例如,如果猜测太高,则需要将新的high
边界设置为猜测。同样,如果猜测太低,则需要将新的low
边界设置为猜测。
答案 2 :(得分:0)
问题不是永久循环。这个程序完全按照你的要求行事:
它说500000,你说它除以2(= 250000)。然后,你说它乘以2(= 500000)。到目前为止......
问题在于你的逻辑。在程序收到信息时,您应该正确建立限制(hi
和low
)。例如,如果程序猜测为500000,并且您说它太高,那么现在您的限制在1到499999(= 500000-1)之间。如果它太低,现在您的限制在500001(= 500000 + 1)和1000000之间。每次猜测您使用middle
和hi
重新计算low
({{1 }})。
希望有所帮助。
答案 3 :(得分:0)
您用来更改计算机猜测的逻辑并不完全正确。您想要做的事情(以及您尝试做的事情)是二进制搜索。
在你的例子中,50000太高,25000太低,所以下一个猜测不应该加倍25000,它应该在50000和25000的中间,或类似37500。
一般情况下,您应该跟踪过高的最低猜测'以及那个太低的最高猜测',下一个猜测应该介于他们之间。
答案 4 :(得分:0)
您应该动态更改 hi 和 low ,而不是保持静态。根据用户的响应,程序应更改 hi 或 low 的值,并将其替换为当前中递减或分别增加,然后通过平均新的 hi 和 low 来设置新的中间。
这是我尝试过的,似乎有效:
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");
}
}
}
}