簡體   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