// ===== CodeLab: C++ 小游戏①:猜数字(面向对象版) =====
// 来源: https://aoerliang.dpdns.org/articles/game-cpp-guess
// 以下代码片段按文章出现顺序拼接, 共 6 段

// ----- 片段 1 (cpp) -----
#include <iostream>

int main() {
    std::cout << "猜数字游戏开始!范围 1~100\n";
    int n;
    while (true) {
        std::cout << "请输入你的猜测: ";
        std::cin >> n;
        // 判断大小并提示(稍后实现)
    }
    return 0;
}

// ----- 片段 2 (cpp) -----
class NumberGuesser {
private:
    int secret_ = 0;           // 秘密数字
    int max_ = 100;            // 范围上限
    std::vector<int> history_;  // 猜测历史

public:
    explicit NumberGuesser(int max) : max_(max) { reset(); }
    void reset();              // 重新生成秘密数字
    bool guess(int n);         // 记录猜测并判断
    int compare(int n) const;  // -1 太小 / 0 猜中 / 1 太大
    const std::vector<int>& history() const { return history_; }
};

// ----- 片段 3 (cpp) -----
void NumberGuesser::reset() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<int> dist(1, max_);
    secret_ = dist(gen);
    history_.clear();
}

// ----- 片段 4 (cpp) -----
bool NumberGuesser::guess(int n) {
    history_.push_back(n);
    return n == secret_;
}

int NumberGuesser::compare(int n) const {
    if (n < secret_) return -1;
    if (n > secret_) return 1;
    return 0;
}

// ----- 片段 5 (cpp) -----
#include <iostream>
#include <random>
#include <vector>

class NumberGuesser {
private:
    int secret_ = 0;
    int max_ = 100;
    std::vector<int> history_;

public:
    explicit NumberGuesser(int max) : max_(max) { reset(); }

    void reset() {
        std::random_device rd;
        std::mt19937 gen(rd());
        std::uniform_int_distribution<int> dist(1, max_);
        secret_ = dist(gen);
        history_.clear();
    }

    bool guess(int n) {
        history_.push_back(n);
        return n == secret_;
    }

    int compare(int n) const {
        if (n < secret_) return -1;
        if (n > secret_) return 1;
        return 0;
    }

    const std::vector<int>& history() const { return history_; }
};

int main() {
    NumberGuesser game(100);
    std::cout << "猜数字:1~100,开始吧!\n";
    int n;
    while (true) {
        std::cout << "> ";
        std::cin >> n;
        if (game.guess(n)) {
            std::cout << "恭喜!共猜了 " << game.history().size() << " 次。\n";
            break;
        }
        if (game.compare(n) < 0) std::cout << "太小了!\n";
        else std::cout << "太大了!\n";
    }
    std::cout << "猜测记录:";
    for (int h : game.history()) std::cout << " " << h;
    std::cout << "\n";
    return 0;
}

// ----- 片段 6 (bash) -----
g++ -std=c++17 -o guess guess.cpp
./guess
