#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <iomanip>

using namespace std;

const int CART_PRICE = 960;

struct Xiangzi {
    int health;
    int money;
    int morale;
    int reputation;
    bool has_cart;
    int day;

    bool married;
    bool met_cao;
    bool met_xiaofuzi;
    bool xiaofuzi_alive;
    bool liu_siye_angry;
    bool helped_erqiang;

    int baoyue_type;
    string chechang;
    bool rent_cart;
};

Xiangzi player;

void initGame();
void showStatus();
void dailyChoice();
void pullCart();
void rest();
void buyCart();
void rentCart();
void returnCart();
void randomEvent();
void checkGameOver();
void showEnding();

void tigerGirlEvent();
void mrCaoEvent();
void xiaofuziEvent();
void chooseBaoyue();
void liuSiyeEvent();
void erqiangziEvent();
void chechangEvent();

int main() {
    srand(time(0));

    cout << "============================================================" << endl;
    cout << "                《骆驼祥子》文字冒险游戏                    " << endl;
    cout << "============================================================" << endl;
    cout << "                  按回车键开始游戏...                       " << endl;
    cin.ignore();

    initGame();

    while (true) {
        cout << "\n======================= 第 " << player.day << " 天 =======================" << endl;
        showStatus();

        if (player.day == 15 && !player.married)
            liuSiyeEvent();
        if (player.day == 18 && !player.married)
            tigerGirlEvent();
        if (!player.met_cao && player.morale < 50 && rand() % 3 == 0)
            mrCaoEvent();
        if (player.day == 30 && player.baoyue_type == 0)
            chooseBaoyue();
        if (player.day >= 40 && !player.met_xiaofuzi && player.married)
            erqiangziEvent();
        if (player.day >= 45 && !player.met_xiaofuzi && player.married)
            xiaofuziEvent();

        dailyChoice();
        randomEvent();
        checkGameOver();

        if (player.rent_cart)
            player.money -= 5;
        if (player.has_cart && player.chechang != "")
            player.money -= 2;
        if (player.money < 0)
            player.money = 0;

        player.day++;
        cout << "\n按回车键进入下一天...";
        cin.ignore();
    }
    return 0;
}

void initGame() {
    player.health = 80;
    player.money = 20;
    player.morale = 90;
    player.reputation = 50;
    player.has_cart = false;
    player.day = 1;

    player.married = false;
    player.met_cao = false;
    player.met_xiaofuzi = false;
    player.xiaofuzi_alive = true;
    player.liu_siye_angry = false;
    player.helped_erqiang = false;

    player.baoyue_type = 0;
    player.chechang = "人和车厂";
    player.rent_cart = true;
}

void showStatus() {
    cout << "\n【状态】" << endl;
    cout << "健康:" << player.health << "   金钱:" << player.money << "   士气:" << player.morale << endl;
    cout << "口碑:" << player.reputation << "   车厂:" << player.chechang << endl;
    cout << "有车:" << (player.has_cart ? "是" : "否")
         << "   租车:" << (player.rent_cart ? "是" : "否")
         << "   婚姻:" << (player.married ? "已婚" : "未婚") << endl;
    cout << "小福子:" << (player.xiaofuzi_alive ? "存活" : "离世")
         << "   包月:";

    if (player.baoyue_type == 1) cout << "曹先生";
    else if (player.baoyue_type == 2) cout << "杨宅";
    else if (player.baoyue_type == 3) cout << "王家";
    else cout << "无";
    cout << endl;
}

void dailyChoice() {
    int choice;
    cout << "\n【行动】" << endl;
    cout << "1.拉车  2.休息  3.车厂" << endl;
    if (player.money >= CART_PRICE && !player.has_cart)
        cout << "4.买车" << endl;

    cout << "请选择:";
    cin >> choice;

    if (choice == 1) pullCart();
    else if (choice == 2) rest();
    else if (choice == 3) chechangEvent();
    else if (choice == 4 && player.money >= CART_PRICE) buyCart();
}

void pullCart() {
    int base = 10;
    if (player.has_cart) base += 10;
    base += player.reputation / 5;

    if (player.baoyue_type == 1) { base += 12; player.morale += 3; }
    if (player.baoyue_type == 2) { base += 20; player.morale -= 10; player.reputation -=5; }
    if (player.baoyue_type == 3) { base += 15; }

    int earn = base + rand()%10 -5;
    if(earn <0) earn=0;

    int cost = 5 + rand()%5;
    if(player.married) cost -=3;
    player.health -= cost;
    if(player.health <0) player.health=0;

    player.money += earn;
    cout << "拉车赚了:" << earn << "  健康消耗:" << cost << endl;
}

void rest() {
    int rec = 12 + rand()%8;
    if(player.married) rec +=5;
    if(player.xiaofuzi_alive && player.met_xiaofuzi) rec +=3;

    player.health += rec;
    if(player.health>100) player.health=100;

    if(player.married) player.morale -=6;
    else player.morale +=2;

    player.money -= (player.married ? 6 : 3);
    if(player.money<0) player.money=0;

    cout << "休息恢复健康:" << rec << endl;
}

void buyCart() {
    int cost = CART_PRICE;
    if(player.married) cost -=250;
    if(player.liu_siye_angry && player.chechang=="人和车厂") cost +=100;

    player.money -= cost;
    player.has_cart = true;
    player.rent_cart = false;
    player.morale +=25;
    cout << "买车成功!花费:" << cost << endl;
}

void chechangEvent() {
    int c;
    cout << "\n1.换车厂 2.租车 3.还车  选择:";
    cin >> c;
    if(c==1) {
        cout << "1.人和车厂  2.仁和车厂:";
        cin >> c;
        if(c==1) player.chechang="人和车厂";
        else player.chechang="仁和车厂";
    }
    else if(c==2) {
        if(!player.rent_cart && player.money >=15) {
            player.money -=15;
            player.rent_cart=true;
            cout << "租车成功\n";
        }
    }
    else if(c==3) {
        player.rent_cart=false;
        cout << "已还车\n";
    }
}

void liuSiyeEvent() {
    cout << "\n【刘四爷】\n1.恭敬  2.冷淡:";
    int c; cin>>c;
    if(c==1) { player.reputation +=10; player.liu_siye_angry=false; }
    else { player.reputation -=15; player.liu_siye_angry=true; }
}

void tigerGirlEvent() {
    cout << "\n【虎妞逼婚】\n1.同意  2.拒绝:";
    int c; cin>>c;
    if(c==1) {
        player.married=true;
        player.money +=200;
        player.liu_siye_angry=true;
    } else {
        player.morale -=45;
        player.reputation -=20;
    }
}

void mrCaoEvent() {
    player.met_cao=true;
    cout << "\n【曹先生】\n1.拉包月  2.拒绝:";
    int c; cin>>c;
    if(c==1) {
        player.baoyue_type=1;
        player.money +=50;
        player.morale +=30;
    }
}

void erqiangziEvent() {
    cout << "\n【二强子借钱】\n1.帮  2.不帮:";
    int c; cin>>c;
    if(c==1) {
        player.money -=20;
        player.helped_erqiang=true;
    } else {
        player.helped_erqiang=false;
        player.morale -=10;
    }
}

void xiaofuziEvent() {
    player.met_xiaofuzi=true;
    cout << "\n【小福子】\n1.帮助她  2.拒绝:";
    int c; cin>>c;
    if(c==1) {
        player.xiaofuzi_alive=true;
        if(!player.helped_erqiang) player.money -=30;
        player.morale +=40;
    } else {
        player.xiaofuzi_alive=false;
        player.morale -=70;
    }
}

void chooseBaoyue() {
    cout << "\n【选择包月】\n1.曹先生 2.杨宅 3.王家:";
    cin >> player.baoyue_type;
}

void randomEvent() {
    if(rand()%3 !=0) return;
    int e = rand()%8;
    if(e==0) { cout<<"下雨没生意\n"; player.money -=3; }
    if(e==1) { cout<<"遇到好主顾\n"; player.money +=10; player.morale +=8; }
    if(e==2) { cout<<"生病\n"; player.health -=20; player.money -=10; }
    if(e==3) { cout<<"被敲诈\n"; player.money -=10; player.morale -=15; }
    if(e==4 && player.has_cart) { cout<<"车被抢!\n"; player.has_cart=0; player.morale -=50; }
    if(e==5 && player.baoyue_type==1) { cout<<"曹先生被盯上,你跑路花钱\n"; player.money -=30; }
    if(e==6 && player.married) { cout<<"虎妞给你钱\n"; player.money +=20; }
    if(e==7 && player.xiaofuzi_alive) { cout<<"小福子给你送吃的\n"; player.morale +=15; }
}

void checkGameOver() {
    if(player.health <=0 || player.morale <=0 || player.day>120) {
        showEnding();
        exit(0);
    }
}

void showEnding() {
    cout << "\n==================== 结局 ====================\n";
    if(player.has_cart && player.xiaofuzi_alive && player.morale>60) {
        cout << "【完美结局】你有车,小福子活着,过上安稳日子!\n";
    } else if(!player.xiaofuzi_alive) {
        cout << "【悲剧结局】小福子死了,你彻底堕落。\n";
    } else if(player.baoyue_type==1) {
        cout << "【普通结局】跟着曹先生,安稳过一生。\n";
    } else {
        cout << "【底层结局】一生拉车,苦苦挣扎。\n";
    }
    cout << "================ 游戏结束 =================\n";
}