#include <string>
#include <iostream>

// dieser code geht davon aus, dass der User stets wahrheitsgemäß antwortet!
// -> ich fange es nicht ab, wenn der User lügt!

int get_response() {
    std::string eingabe;
    std::getline(std::cin, eingabe);
    return eingabe == "ja";
}

int get_untere_schranke(int *obere_schranke, int *untere_schranke) {
    std::cout << "Ist die Zahl kleiner als " << *untere_schranke << " ?" << std::endl;
    if (get_response()) {
        *obere_schranke = *untere_schranke;
        *untere_schranke -= 10;
        get_untere_schranke(obere_schranke, untere_schranke);
    }
    return 0;
}

int get_obere_schranke(int *obere_schranke, int* untere_schranke) {
    std::cout << "Ist die Zahl größer als " << *obere_schranke << " ?" << std::endl;
    if (get_response()) {
        *untere_schranke = *obere_schranke;
        *obere_schranke += 10;
        get_obere_schranke(obere_schranke, untere_schranke);
    }
    return 0;
}

void lets_guess(int guess, int *untere_schranke, int *obere_schranke) {
    std::cout << "Ist es die " << guess << " ?" << std::endl;
    if (get_response())
        return;
    
    std::cout << "Ist die Zahl größer als " << guess << " ?" << std::endl;
    if (get_response()) {
        *untere_schranke = guess;
    } else {
        *obere_schranke = guess;
    }
    
    if ((*untere_schranke - *obere_schranke == 1) || (*untere_schranke - *obere_schranke == -1)) {
        std::cout << "Ist es die " << guess-1 << " ?" << std::endl;
        if (get_response())
            return;
    }
    
    lets_guess((*untere_schranke + *obere_schranke) / 2, untere_schranke, obere_schranke);
    return;
}

int main() {
    std::cout << "Ich möchte eine Zahl von dir erraten! \n \
        Bitte beantworte meine Fragen wahrheitsgemäß mit \"ja\" oder \"nein\"." << std::endl;
    
    int untere_schranke = 0;
    int obere_schranke = 10;
    
    get_untere_schranke(&obere_schranke, &untere_schranke);
    get_obere_schranke(&obere_schranke, &untere_schranke);
    
    lets_guess((untere_schranke + obere_schranke) / 2, &untere_schranke, &obere_schranke);
    std::cout << "Vielen Dank fürs Spielen!" << std::endl;
    return 0;
}
