import java.util.Scanner;

public class GuessingGame {

private Scanner reader;

public GuessingGame() {
    // use only this scanner, othervise the tests do not work
    this.reader = new Scanner(System.in);
}

public void play(int lowerLimit, int upperLimit) {
    instructions(lowerLimit, upperLimit);
    boolean isAboveAverage;
    int counter = -1;

    while (counter < howManyTimesHalvable(upperLimit - lowerLimit)) {
        isAboveAverage = isGreaterThan(average(lowerLimit, upperLimit));
        if (upperLimit == lowerLimit) {
            break;
        }
        if (isAboveAverage) {
            lowerLimit = average(lowerLimit, upperLimit);
        } else {
            upperLimit = average(lowerLimit, upperLimit);
        }
        counter++;
    }

    System.out.println("your number is " + upperLimit);
}

// implement here the methods isGreaterThan and average
public boolean isGreaterThan(int number) {
    boolean isGreater = false;
    boolean isCorrectAnswerGiven = false;

    while (!isCorrectAnswerGiven) {
        System.out.println("Is your number greater than " + (number) + "? (y/n)");
        String answer = reader.nextLine();

        if (answer.equals("yes") || answer.equals("y")) {
            isGreater = true;
            isCorrectAnswerGiven = true;
        } else if (answer.equals("no") || answer.equals("n")) {
            isCorrectAnswerGiven = true;
        }
    }

    return isGreater;
}

public int average(int upperLimit, int lowerLimit) {
    return (upperLimit + lowerLimit) / 2;
}

public int average2(int firstNumber, int secondNumber) {
    double res = (firstNumber + secondNumber) / 2.0;
    Math.round(res);
    //System.out.println(res);
    return (int) res;
}

public void instructions(int lowerLimit, int upperLimit) {
    int maxQuestions = howManyTimesHalvable(upperLimit - lowerLimit);

    System.out.println("Think of a number between " + lowerLimit + "..." + upperLimit + ".");

    System.out.println("I promise you that I can guess the number you are thinking with " + maxQuestions + " questions.");
    System.out.println("");
    System.out.println("Next I'll present you a series of questions. Answer them honestly.");
    System.out.println("");
}

// a helper method:
public static int howManyTimesHalvable(int number) {
    // we create a base two logarithm  of the given value

    // Below we swap the base number to base two logarithms!
    return (int) (Math.log(number) / Math.log(2)) + 1;
 }
}

मुझे इस कोड को डीबग करने में समस्या है। इस कक्षा में, मुझे एक साधारण एआई लागू करना है जो प्रश्न पर आपके उत्तर के आधार पर एक संख्या का अनुमान लगाता है "क्या आपकी संख्या अधिक है" + एक संख्या। मेरी समस्याएं ए. कोड दी गई सीमा के अंत तक कभी नहीं पहुंचता है (इसलिए, 1 से 10 की सीमा के साथ, यह कभी भी 1 या 10 का अनुमान नहीं लगाता है) और ख। समय पर रुकता नहीं है। जावा अक्सर एक प्रश्न को कई बार दोहराता है, लेकिन प्रोग्राम को इसका उत्तर जल्द से जल्द बताना चाहिए।

मेरी गलती स्पष्ट रूप से खेल-विधि में है (मैंने पूरी कक्षा को पूर्णता के लिए शामिल किया था), मुझे नहीं पता कि कहाँ है। मेरा प्रोग्राम काम करता है, इसलिए एक टाइपो या प्रोग्रामिंग गलती की संभावना नहीं है। मुझे अपने तर्क में कुछ गलत करना चाहिए, लेकिन मुझे नहीं पता कि क्या। क्या किसी को पता है कि त्रुटि कहाँ है?

1
Jay Aberlour 16 नवम्बर 2018, 17:30

1 उत्तर

सबसे बढ़िया उत्तर

आपके तर्क में कुछ समस्याएं हैं:

  • आप प्रत्येक पुनरावृत्ति में howManyTimesHalvable की गणना कर रहे हैं। counter की वृद्धि को देखते हुए इसका कोई मतलब नहीं है। इसके लिए अंतिम संभावित मान हमेशा 1 होता है जो वर्तमान counter से बहुत कम हो सकता है।
  • आप जाँच कर रहे हैं कि क्या उन मानों को अपडेट किए बिना प्रश्न पूछने के तुरंत बाद ऊपरी और निचले समान हैं। बस इसे लूप के अंत तक ले जाएं।
  • आखिरी बात यह है कि lowerLimit को अपडेट करते समय आपको औसत को 1 से बढ़ाना होगा। यदि "क्या आपका नंबर X से बड़ा है" का उत्तर हां है, तो नया lowerLimit X नहीं हो सकता।

ठीक किया गया तरीका:

public void play(int lowerLimit, int upperLimit) {
    instructions(lowerLimit, upperLimit);
    boolean isAboveAverage;
    int counter = howManyTimesHalvable(upperLimit - lowerLimit);
    while (counter > 0) {
        isAboveAverage = isGreaterThan(average(lowerLimit, upperLimit));
        if (isAboveAverage) {
            lowerLimit = average(lowerLimit, upperLimit)+1;
        } else {
            upperLimit = average(lowerLimit, upperLimit);
        }
        if (upperLimit == lowerLimit) {
            break;
        }
        counter--;
    }
    System.out.println("your number is " + upperLimit);
}
0
Turamarth 17 नवम्बर 2018, 13:35