0

以下のコードの壁は、ループが実行されるたびに「lowestguess」と「highestguess」の値を変更する必要があります。理想的には、最大の推測を 100 から下げ、最小の推測を 1 から上げて、プログラムが既に推測した数値よりも小さいまたは大きい数値を推測できないようにすることを意味します (プログラムを完了するために必要なループの量を減らします)。

ただし、「takestab」関数を実行するたびに、最小推測値と最大推測値は常にデフォルトの 1 と 100 にリセットされます。エラーが発生していないため、ここで何が起こっているのかわかりません。

ここのメソッドはプライベートであるため、それぞれのスコープ外の変数を更新しない可能性はありますか?

import java.util.Scanner;

public class AIGuessing
{
    public static void main(String[]args) 
    {
        //DECLARATIONS*
        Scanner inputReader = new Scanner(System.in);
        int number;
        int guess;
        int guesses = 0;
        int lowestguess = 1;
        int highestguess = 100;

        //code
        System.out.println("Welcome!");
        System.out.println("Please enter a number for the AI to guess");
        number = inputReader.nextInt();

        //computer tries to guess number
        do
        {
            guesses++;
            guess = takestab(lowestguess, highestguess, number);
            System.out.println("\"I guess " +guess+ ".\"");
        }while(guess != number);

        if(guess == number)
        {
            System.out.println("WOO! I got it!");
        }

        if(guesses >= 1 && guesses ==2)
        {
            System.out.println(guesses + " guesses? I..AM...GOD!!!!");
        }
        else if(guesses >= 3 && guesses <= 5)
        {
            System.out.println(guesses + " guesses? Hooray! I'm as average as gravy!!!");
        }
        else if(guesses >= 6 && guesses <= 8)
        {
            System.out.println(guesses + " guesses? I only guess when I'm drunk");
        }
        else if(guesses >= 9)
        {
            System.out.println(guesses + " guesses? Bugger me... turn me into scrap");
        }
        //end code
    }

    public static int takestab(Integer lowestguess, Integer highestguess, Integer number)
    {  

        int estimate;
        estimate = estimate(lowestguess, highestguess);
        System.out.println("Estimate is: "+estimate+".");

        if(estimate < number && estimate > lowestguess)
        {
            lowestguess = estimate;
            barkchange(lowestguess, highestguess, estimate);
        }
        else if(estimate > number && estimate < highestguess)
        {
            highestguess = estimate;
            barkchange(lowestguess, highestguess, estimate);
        }
                return estimate;
    }

    //function to generate and return a random number
    public static int estimate(int low, int high)
    {
        int comGuess;
        comGuess = (low + (int)(Math.random() * ((high - low) + low)));
        return comGuess;
    }

    //function to 'bark' the changes of lowest and highest guesses
    public static void barkchange(Integer lowestguess, Integer highestguess, Integer guess)
    {
        System.out.println("Current guess is: "+guess+".");
        System.out.println("Lowest guess is: "+lowestguess+".");
        System.out.println("Highest guess is: "+highestguess+".\n");
    }
}
4

1 に答える 1

3

整数は不変オブジェクトです。

lowestguess = estimate;

この行 (および の行highestguess) で、渡したものではなく、lowestguess のローカル コピーを変更しています。

この場合の最も簡単な解決策は、lowestguess と maximumguess を「グローバルに」(静的に) 宣言することです。

メインプットの上

static int highestGuess = 100;
static int lowestGuess = 1;

次に、パラメーターをメソッドから削除できます。パラメーターを渡す必要はもうありません。静的なものを直接参照できます。

つまらない人のための余談: ここでは「グローバル」を使用しました。ここには OO がないからです。このコンテキストでの静的変数は、すべての意図と目的のためにグローバル変数です。

于 2013-09-24T16:18:57.613 に答える