#include <iostream>
#include <vector>
#include <string>
#include <random>
#include <algorithm>
#include <fstream>
#include <ctime>
#include <memory>
#include <map>
#include <bits/stdc++.h>
using namespace std;

// 球员类
class Player {
private:
    string name;        // 姓名
    int age;            // 年龄
    string position;    // 位置
    int overall;        // 综合能力
    int potential;      // 潜力
    int contractYears;  // 合同年数
    double salary;      // 薪水
    bool isInjured;     // 是否受伤
    bool isOnTradeBlock;// 是否在交易名单上

public:
    Player(string name, int age, string position, int overall, int potential, int contractYears, double salary)
        : name(name), age(age), position(position), overall(overall), potential(potential),
          contractYears(contractYears), salary(salary), isInjured(false), isOnTradeBlock(false) {}

    string getName() const { return name; }
    int getAge() const { return age; }
    string getPosition() const { return position; }
    int getOverall() const { return overall; }
    int getPotential() const { return potential; }
    int getContractYears() const { return contractYears; }
    double getSalary() const { return salary; }
    bool getIsInjured() const { return isInjured; }
    bool getIsOnTradeBlock() const { return isOnTradeBlock; }

    void setOverall(int newOverall) { overall = newOverall; }
    void setPotential(int newPotential) { potential = newPotential; }
    void setContractYears(int years) { contractYears = years; }
    void setSalary(double newSalary) { salary = newSalary; }
    void setIsInjured(bool injured) { isInjured = injured; }
    void setIsOnTradeBlock(bool onTradeBlock) { isOnTradeBlock = onTradeBlock; }

    void agePlayer() {
        age++;
        // 随机提升或下降能力值,取决于潜力和年龄
        random_device rd;
        mt19937 gen(rd());
        uniform_int_distribution<> dis(-3, 3);
        int change = dis(gen);
        
        // 年龄较大的球员更可能下降
        if (age > 30) {
            if (change > 0) change = 0;
            change -= 1;
        } else if (age < 25 && potential > 80) {
            if (change < 0) change = 0;
            change += 1;
        }
        
        overall = max(50, min(99, overall + change));
    }

    void simulateInjury() {
        random_device rd;
        mt19937 gen(rd());
        uniform_int_distribution<> dis(1, 100);
        int injuryChance = dis(gen);
        
        // 年龄较大的球员更容易受伤
        if (age > 30 && injuryChance < 15) {
            isInjured = true;
        } else if (injuryChance < 5) {
            isInjured = true;
        } else {
            isInjured = false;
        }
    }

    string getPositionShort() const {
        if (position == "控球后卫") return "PG";
        if (position == "得分后卫") return "SG";
        if (position == "小前锋") return "SF";
        if (position == "大前锋") return "PF";
        return "C"; // 中锋
    }

    void displayInfo() const {
        cout << name << " (" << getPositionShort() << ") | 年龄: " << age
             << " | 能力值: " << overall << " | 潜力: " << potential
             << " | 合同: " << contractYears << "年, $" << salary / 1000000 << "百万/年";
        if (isInjured) cout << " | 受伤";
        if (isOnTradeBlock) cout << " | 交易名单";
        cout << endl;
    }
};

// 球队类
class Team {
private:
    string name;            // 队名
    string city;            // 所在城市
    vector<shared_ptr<Player>> roster; // 球员名单
    double salaryCap;       // 工资帽
    double currentSalary;   // 当前工资总额
    int wins;               // 胜场数
    int losses;             // 负场数
    int draftPick;          // 选秀顺位
    map<string, int> teamChemistry; // 球队化学反应

public:
    Team(string name, string city, double salaryCap)
        : name(name), city(city), salaryCap(salaryCap), currentSalary(0), wins(0), losses(0), draftPick(15) {
        // 初始化球队化学反应
        teamChemistry["PG"] = 70;
        teamChemistry["SG"] = 70;
        teamChemistry["SF"] = 70;
        teamChemistry["PF"] = 70;
        teamChemistry["C"] = 70;
    }

    string getName() const { return name; }
    string getCity() const { return city; }
    vector<shared_ptr<Player>> getRoster() const { return roster; }
    double getSalaryCap() const { return salaryCap; }
    double getCurrentSalary() const { return currentSalary; }
    int getWins() const { return wins; }
    int getLosses() const { return losses; }
    int getDraftPick() const { return draftPick; }
    double getWinPercentage() const {
        if (wins + losses == 0) return 0.0;
        return static_cast<double>(wins) / (wins + losses);
    }

    void addPlayer(shared_ptr<Player> player) {
        roster.push_back(player);
        currentSalary += player->getSalary();
    }

    void removePlayer(shared_ptr<Player> player) {
        for (auto it = roster.begin(); it != roster.end(); ++it) {
            if (*it == player) {
                currentSalary -= player->getSalary();
                roster.erase(it);
                break;
            }
        }
    }

    void updateChemistry() {
        // 简单模拟化学反应变化
        random_device rd;
        mt19937 gen(rd());
        uniform_int_distribution<> dis(-3, 3);
        
        for (auto& pair : teamChemistry) {
            pair.second = max(50, min(99, pair.second + dis(gen)));
        }
    }

    void displayRoster() const {
        cout << "\n" << city << " " << name << " 球员名单:" << endl;
        cout << "----------------------------------------" << endl;
        for (const auto& player : roster) {
            player->displayInfo();
        }
        cout << "\n球队薪资: $" << currentSalary / 1000000 << "百万 / $" << salaryCap / 1000000 << "百万" << endl;
        cout << "战绩: " << wins << "-" << losses << endl;
    }

    void simulateSeason() {
        // 模拟82场比赛的赛季
        for (int i = 0; i < 82; i++) {
            random_device rd;
            mt19937 gen(rd());
            uniform_int_distribution<> dis(1, 100);
            int result = dis(gen);
            
            // 根据球队实力决定胜负
            int teamStrength = calculateTeamStrength();
            if (result <= teamStrength) {
                wins++;
            } else {
                losses++;
            }
        }
        
        // 更新选秀顺位
        updateDraftPick();
    }

    int calculateTeamStrength() const {
        int strength = 0;
        for (const auto& player : roster) {
            if (!player->getIsInjured()) {
                strength += player->getOverall();
            }
        }
        
        // 添加化学反应因素
        for (const auto& pair : teamChemistry) {
            strength += pair.second;
        }
        
        // 调整为百分比
        return min(95, max(5, strength / 25));
    }

    void updateDraftPick() {
        // 模拟乐透抽签,战绩越差抽中高顺位概率越高
        double winPct = getWinPercentage();
        random_device rd;
        mt19937 gen(rd());
        uniform_real_distribution<> dis(0.0, 1.0);
        double lotteryResult = dis(gen);
        
        // 简单的概率模型
        if (winPct < 0.3) {
            if (lotteryResult < 0.25) draftPick = 1;
            else if (lotteryResult < 0.55) draftPick = 2;
            else if (lotteryResult < 0.8) draftPick = 3;
            else draftPick = 4 + (rand() % 4); // 4-7
        } else if (winPct < 0.45) {
            draftPick = 5 + (rand() % 5); // 5-9
        } else if (winPct < 0.6) {
            draftPick = 10 + (rand() % 7); // 10-16
        } else {
            draftPick = 15 + (rand() % 10); // 15-24
        }
    }

    void ageRoster() {
        for (const auto& player : roster) {
            player->agePlayer();
        }
    }

    void simulateInjuries() {
        for (const auto& player : roster) {
            player->simulateInjury();
        }
    }

    void resetSeason() {
        wins = 0;
        losses = 0;
        updateChemistry();
    }

    void setDraftPick(int pick) { draftPick = pick; }

    // 为交易做准备,返回球员列表(不包括不可交易的球员)
    vector<shared_ptr<Player>> getTradeablePlayers() const {
        vector<shared_ptr<Player>> tradeable;
        for (const auto& player : roster) {
            if (!player->getIsInjured()) {
                tradeable.push_back(player);
            }
        }
        return tradeable;
    }
};

// 选秀类
class Draft {
private:
    vector<shared_ptr<Player>> prospects; // 新秀列表

public:
    Draft() {
        // 生成60名新秀
        generateProspects();
    }

    void generateProspects() {
        prospects.clear();
        
        vector<string> firstNames = {"约翰", "迈克尔", "大卫", "詹姆斯", "罗伯特", "丹尼尔", "马修", "安德鲁", "约瑟夫", "瑞安", 
                                     "贾斯汀", "布兰登", "克里斯托弗", "托马斯", "乔纳森", "凯文", "布莱恩", "爱德华", "贾森", "蒂莫西"};
        vector<string> lastNames = {"史密斯", "约翰逊", "威廉姆斯", "琼斯", "布朗", "戴维斯", "米勒", "威尔逊", "摩尔", "泰勒", 
                                    "安德森", "托马斯", "杰克逊", "怀特", "哈里斯", "马丁", "汤普森", "加西亚", "马丁内斯", "罗宾逊"};
        vector<string> positions = {"控球后卫", "得分后卫", "小前锋", "大前锋", "中锋"};

        random_device rd;
        mt19937 gen(rd());
        
        // 乐透秀
        for (int i = 0; i < 14; i++) {
            string name = firstNames[rand() % firstNames.size()] + " " + lastNames[rand() % lastNames.size()];
            string position = positions[rand() % positions.size()];
            int age = 19 + (rand() % 3);
            
            // 乐透秀能力值范围
            uniform_int_distribution<> overallDis(75, 88);
            uniform_int_distribution<> potentialDis(85, 95);
            
            int overall = overallDis(gen);
            int potential = potentialDis(gen);
            
            prospects.push_back(make_shared<Player>(name, age, position, overall, potential, 4, (overall - 60) * 1000000));
        }
        
        // 首轮中段
        for (int i = 0; i < 10; i++) {
            string name = firstNames[rand() % firstNames.size()] + " " + lastNames[rand() % lastNames.size()];
            string position = positions[rand() % positions.size()];
            int age = 20 + (rand() % 3);
            
            // 首轮中段能力值范围
            uniform_int_distribution<> overallDis(68, 77);
            uniform_int_distribution<> potentialDis(75, 85);
            
            int overall = overallDis(gen);
            int potential = potentialDis(gen);
            
            prospects.push_back(make_shared<Player>(name, age, position, overall, potential, 4, (overall - 60) * 750000));
        }
        
        // 首轮末段
        for (int i = 0; i < 8; i++) {
            string name = firstNames[rand() % firstNames.size()] + " " + lastNames[rand() % lastNames.size()];
            string position = positions[rand() % positions.size()];
            int age = 21 + (rand() % 3);
            
            // 首轮末段能力值范围
            uniform_int_distribution<> overallDis(63, 72);
            uniform_int_distribution<> potentialDis(70, 80);
            
            int overall = overallDis(gen);
            int potential = potentialDis(gen);
            
            prospects.push_back(make_shared<Player>(name, age, position, overall, potential, 4, (overall - 60) * 500000));
        }
        
        // 次轮
        for (int i = 0; i < 28; i++) {
            string name = firstNames[rand() % firstNames.size()] + " " + lastNames[rand() % lastNames.size()];
            string position = positions[rand() % positions.size()];
            int age = 22 + (rand() % 4);
            
            // 次轮能力值范围
            uniform_int_distribution<> overallDis(55, 67);
            uniform_int_distribution<> potentialDis(60, 75);
            
            int overall = overallDis(gen);
            int potential = potentialDis(gen);
            
            prospects.push_back(make_shared<Player>(name, age, position, overall, potential, 2, (overall - 55) * 300000));
        }
    }

    void displayProspects() const {
        cout << "\n2025年NBA选秀球员:" << endl;
        cout << "----------------------------------------" << endl;
        for (size_t i = 0; i < prospects.size(); i++) {
            cout << i + 1 << ". ";
            prospects[i]->displayInfo();
        }
    }

    shared_ptr<Player> draftPlayer(int pick) {
        if (pick >= 1 && pick <= static_cast<int>(prospects.size())) {
            shared_ptr<Player> selected = prospects[pick - 1];
            prospects.erase(prospects.begin() + pick - 1);
            return selected;
        }
        return nullptr;
    }

    vector<shared_ptr<Player>> getProspects() const {
        return prospects;
    }
};

// 游戏类
class NBAGame {
private:
    vector<shared_ptr<Team>> teams;     // 所有球队
    shared_ptr<Team> userTeam;          // 用户球队
    int currentYear;                    // 当前年份
    bool gameOver;                      // 游戏是否结束

public:
    NBAGame() : currentYear(2025), gameOver(false) {
        initializeTeams();
        selectUserTeam();
        cout << "\n欢迎来到2025年NBA经理游戏!" << endl;
        cout << "你现在是" << userTeam->getCity() << " " << userTeam->getName() << "的总经理。" << endl;
        cout << "你的目标是通过交易、自由球员签约和选秀来组建一支冠军球队。" << endl;
    }

    void initializeTeams() {
        // 创建30支球队
        vector<pair<string, string>> teamInfo = {
            {"公牛", "芝加哥"}, {"凯尔特人", "波士顿"}, {"篮网", "布鲁克林"}, {"黄蜂", "夏洛特"},
            {"雄鹿", "密尔沃基"}, {"骑士", "克利夫兰"}, {"独行侠", "达拉斯"}, {"掘金", "丹佛"},
            {"活塞", "底特律"}, {"勇士", "金州"}, {"火箭", "休斯顿"}, {"步行者", "印第安纳"},
            {"快船", "洛杉矶"}, {"湖人", "洛杉矶"}, {"灰熊", "孟菲斯"}, {"热火", "迈阿密"},
            {"雄鹿", "密尔沃基"}, {"森林狼", "明尼苏达"}, {"鹈鹕", "新奥尔良"}, {"尼克斯", "纽约"},
            {"雷霆", "俄克拉荷马城"}, {"魔术", "奥兰多"}, {"76人", "费城"}, {"太阳", "菲尼克斯"},
            {"开拓者", "波特兰"}, {"国王", "萨克拉门托"}, {"马刺", "圣安东尼奥"}, {"猛龙", "多伦多"},
            {"爵士", "犹他"}, {"奇才", "华盛顿"}
        };

        double salaryCap = 222000000; // 2025年工资帽(单位:美元)

        for (const auto& info : teamInfo) {
            auto team = make_shared<Team>(info.first, info.second, salaryCap);
            generateRoster(team);
            teams.push_back(team);
        }
    }

    void generateRoster(shared_ptr<Team> team) {
        vector<string> positions = {"控球后卫", "得分后卫", "小前锋", "大前锋", "中锋"};
        random_device rd;
        mt19937 gen(rd());
        
        // 生成15人阵容
        for (int i = 0; i < 15; i++) {
            string position;
            if (i < 5) {
                position = positions[i]; // 确保每个位置至少有一名球员
            } else {
                position = positions[rand() % positions.size()];
            }
            
            // 主力球员能力值更高
            int overall;
            int potential;
            if (i < 5) {
                uniform_int_distribution<> dis(70, 90);
                overall = dis(gen);
                potential = overall + (rand() % 10);
            } else if (i < 10) {
                uniform_int_distribution<> dis(60, 75);
                overall = dis(gen);
                potential = overall + (rand() % 8);
            } else {
                uniform_int_distribution<> dis(55, 65);
                overall = dis(gen);
                potential = overall + (rand() % 5);
            }
            
            potential = min(99, potential);
            
            // 年龄分布
            int age;
            if (i < 3) {
                age = 25 + (rand() % 7); // 核心球员年龄在25-31岁
            } else if (i < 8) {
                age = 22 + (rand() % 8); // 角色球员年龄在22-29岁
            } else {
                age = 20 + (rand() % 10); // 替补球员年龄在20-29岁
            }
            
            // 合同年数和薪资
            int contractYears = 1 + (rand() % 5);
            double salary = (overall - 55) * 1000000; // 简单的薪资计算
            
            // 随机生成名字
            vector<string> firstNames = {"约翰", "迈克尔", "大卫", "詹姆斯", "罗伯特", "丹尼尔", "马修", "安德鲁", "约瑟夫", "瑞安", 
                                        "贾斯汀", "布兰登", "克里斯托弗", "托马斯", "乔纳森", "凯文", "布莱恩", "爱德华", "贾森", "蒂莫西"};
            vector<string> lastNames = {"史密斯", "约翰逊", "威廉姆斯", "琼斯", "布朗", "戴维斯", "米勒", "威尔逊", "摩尔", "泰勒", 
                                        "安德森", "托马斯", "杰克逊", "怀特", "哈里斯", "马丁", "汤普森", "加西亚", "马丁内斯", "罗宾逊"};
            
            string name = firstNames[rand() % firstNames.size()] + " " + lastNames[rand() % lastNames.size()];
            
            // 创建球员并添加到球队
            auto player = make_shared<Player>(name, age, position, overall, potential, contractYears, salary);
            team->addPlayer(player);
        }
    }

    void selectUserTeam() {
        cout << "选择你的球队:" << endl;
        for (size_t i = 0; i < teams.size(); i++) {
            cout << i + 1 << ". " << teams[i]->getCity() << " " << teams[i]->getName() << endl;
        }
        
        int choice;
        do {
            cout << "输入球队编号 (1-30): ";
            cin >> choice;
            cin.ignore(); // 忽略换行符
        } while (choice < 1 || choice > 30);
        
        userTeam = teams[choice - 1];
    }

    void displayStandings() const {
        // 复制球队列表并按胜率排序
        vector<shared_ptr<Team>> sortedTeams = teams;
        sort(sortedTeams.begin(), sortedTeams.end(), 
             [](const shared_ptr<Team>& a, const shared_ptr<Team>& b) {
                 return a->getWinPercentage() > b->getWinPercentage();
             });
        
        cout << "\n" << currentYear << "年NBA排名:" << endl;
        cout << "----------------------------------------" << endl;
        cout << "排名 | 球队                | 胜负    | 胜率" << endl;
        cout << "----------------------------------------" << endl;
        
        for (size_t i = 0; i < sortedTeams.size(); i++) {
            cout << setw(4) << i + 1 << " | ";
            cout << setw(20) << left << sortedTeams[i]->getCity() + " " + sortedTeams[i]->getName() << " | ";
            cout << setw(6) << sortedTeams[i]->getWins() << "-" << sortedTeams[i]->getLosses() << " | ";
            cout << fixed << setprecision(3) << sortedTeams[i]->getWinPercentage() << endl;
        }
    }

    void simulateSeason() {
        cout << "\n模拟" << currentYear << "赛季..." << endl;
        
        // 重置所有球队的赛季数据
        for (const auto& team : teams) {
            team->resetSeason();
        }
        
        // 模拟每个球队的赛季
        for (const auto& team : teams) {
            team->simulateSeason();
        }
        
        // 显示常规赛结果
        displayStandings();
        
        // 模拟季后赛
        simulatePlayoffs();
        
        // 增加年份
        currentYear++;
        
        // 老化球员
        ageAllPlayers();
        
        // 处理合同到期
        handleExpiringContracts();
        
        // 生成选秀
        Draft draft;
        cout << "\n" << currentYear << "年NBA选秀即将到来..." << endl;
        
        // 显示乐透抽签结果
        conductLottery();
        
        // 显示用户球队的选秀权
        cout << "\n你的球队拥有第" << userTeam->getDraftPick() << "号选秀权。" << endl;
        
        // 执行选秀
        conductDraft(draft);
        
        // 显示更新后的阵容
        userTeam->displayRoster();
        
        cout << "\n" << currentYear << "赛季准备开始!" << endl;
    }

    void simulatePlayoffs() {
        cout << "\n模拟季后赛..." << endl;
        
        // 复制球队列表并按胜率排序
        vector<shared_ptr<Team>> easternConference;
        vector<shared_ptr<Team>> westernConference;
        
        // 简单划分东西部
        for (size_t i = 0; i < teams.size(); i++) {
            if (i < 15) {
                easternConference.push_back(teams[i]);
            } else {
                westernConference.push_back(teams[i]);
            }
        }
        
        // 东西部按胜率排序
        sort(easternConference.begin(), easternConference.end(), 
             [](const shared_ptr<Team>& a, const shared_ptr<Team>& b) {
                 return a->getWinPercentage() > b->getWinPercentage();
             });
        
        sort(westernConference.begin(), westernConference.end(), 
             [](const shared_ptr<Team>& a, const shared_ptr<Team>& b) {
                 return a->getWinPercentage() > b->getWinPercentage();
             });
        
        // 模拟东部季后赛
        shared_ptr<Team> easternChampion = simulateConferencePlayoffs(easternConference, "东部");
        
        // 模拟西部季后赛
        shared_ptr<Team> westernChampion = simulateConferencePlayoffs(westernConference, "西部");
        
        // 模拟总决赛
        simulateFinals(easternChampion, westernChampion);
    }

    shared_ptr<Team> simulateConferencePlayoffs(vector<shared_ptr<Team>> conference, string conferenceName) {
        cout << "\n" << conferenceName << "联盟季后赛:" << endl;
        cout << "----------------------------------------" << endl;
        
        // 首轮
        vector<shared_ptr<Team>> round1Winners;
        for (int i = 0; i < 4; i++) {
            shared_ptr<Team> higherSeed = conference[i];
            shared_ptr<Team> lowerSeed = conference[7 - i];
            
            cout << "\n第一轮: #" << i + 1 << " " << higherSeed->getCity() << " " << higherSeed->getName() 
                 << " 对阵 #" << 8 - i << " " << lowerSeed->getCity() << " " << lowerSeed->getName() << endl;
            
            shared_ptr<Team> winner = simulateSeries(higherSeed, lowerSeed, 7);
            round1Winners.push_back(winner);
            cout << winner->getCity() << " " << winner->getName() << " 晋级下一轮!" << endl;
        }
        
        // 次轮
        vector<shared_ptr<Team>> round2Winners;
        for (int i = 0; i < 2; i++) {
            shared_ptr<Team> team1 = round1Winners[i];
            shared_ptr<Team> team2 = round1Winners[3 - i];
            
            cout << "\n第二轮: " << team1->getCity() << " " << team1->getName() 
                 << " 对阵 " << team2->getCity() << " " << team2->getName() << endl;
            
            shared_ptr<Team> winner = simulateSeries(team1, team2, 7);
            round2Winners.push_back(winner);
            cout << winner->getCity() << " " << winner->getName() << " 晋级分区决赛!" << endl;
        }
        
        // 分区决赛
        shared_ptr<Team> conferenceChampion;
        cout << "\n分区决赛: " << round2Winners[0]->getCity() << " " << round2Winners[0]->getName() 
             << " 对阵 " << round2Winners[1]->getCity() << " " << round2Winners[1]->getName() << endl;
        
        conferenceChampion = simulateSeries(round2Winners[0], round2Winners[1], 7);
        cout << conferenceChampion->getCity() << " " << conferenceChampion->getName() 
             << " 是" << conferenceName << "联盟冠军!" << endl;
        
        return conferenceChampion;
    }

    shared_ptr<Team> simulateSeries(shared_ptr<Team> team1, shared_ptr<Team> team2, int maxGames) {
        int team1Wins = 0;
        int team2Wins = 0;
        
        while (team1Wins < (maxGames + 1) / 2 && team2Wins < (maxGames + 1) / 2) {
            // 模拟一场比赛
            random_device rd;
            mt19937 gen(rd());
            uniform_real_distribution<> dis(0.0, 1.0);
            
            // 基于球队实力和主场优势
            double team1Strength = team1->calculateTeamStrength() * 1.05; // 主场优势
            double team2Strength = team2->calculateTeamStrength();
            
            double totalStrength = team1Strength + team2Strength;
            double team1WinProbability = team1Strength / totalStrength;
            
            if (dis(gen) < team1WinProbability) {
                team1Wins++;
            } else {
                team2Wins++;
            }
            
            // 轮换主场优势
            swap(team1Strength, team2Strength);
        }
        
        if (team1Wins > team2Wins) {
            return team1;
        } else {
            return team2;
        }
    }

    void simulateFinals(shared_ptr<Team> easternChampion, shared_ptr<Team> westernChampion) {
        cout << "\nNBA总决赛: " << easternChampion->getCity() << " " << easternChampion->getName() 
             << " 对阵 " << westernChampion->getCity() << " " << westernChampion->getName() << endl;
        
        shared_ptr<Team> nbaChampion = simulateSeries(easternChampion, westernChampion, 7);
        cout << "\n" << nbaChampion->getCity() << " " << nbaChampion->getName() 
             << " 是" << currentYear << "年NBA总冠军!" << endl;
        
        if (nbaChampion == userTeam) {
            cout << "恭喜你! 你赢得了NBA总冠军!" << endl;
        }
    }

    void conductLottery() {
        cout << "\n进行" << currentYear << "年NBA选秀乐透抽签..." << endl;
        
        // 按战绩排序(战绩差的在前)
        vector<shared_ptr<Team>> lotteryTeams = teams;
        sort(lotteryTeams.begin(), lotteryTeams.end(), 
             [](const shared_ptr<Team>& a, const shared_ptr<Team>& b) {
                 return a->getWinPercentage() < b->getWinPercentage();
             });
        
        // 只取乐透区球队(14支)
        vector<shared_ptr<Team>> lotteryPicks;
        for (int i = 0; i < 14 && i < static_cast<int>(lotteryTeams.size()); i++) {
            lotteryPicks.push_back(lotteryTeams[i]);
        }
        
        // 随机分配乐透顺位
        vector<int> draftOrder;
        for (int i = 1; i <= 14; i++) {
            draftOrder.push_back(i);
        }
        random_shuffle(draftOrder.begin(), draftOrder.end());
        
        // 分配顺位
        for (int i = 0; i < 14 && i < static_cast<int>(lotteryPicks.size()); i++) {
            lotteryPicks[i]->setDraftPick(draftOrder[i]);
        }
        
        // 剩余顺位(非乐透)
        for (size_t i = 14; i < teams.size(); i++) {
            teams[i]->setDraftPick(i + 1);
        }
        
        // 显示乐透结果
        cout << "\n乐透抽签结果:" << endl;
        cout << "----------------------------------------" << endl;
        for (int i = 0; i < 14 && i < static_cast<int>(lotteryPicks.size()); i++) {
            cout << "第" << draftOrder[i] << "号签: " 
                 << lotteryPicks[i]->getCity() << " " << lotteryPicks[i]->getName() << endl;
        }
    }

    void conductDraft(Draft& draft) {
        cout << "\n" << currentYear << "年NBA选秀:" << endl;
        cout << "----------------------------------------" << endl;
        
        // 按选秀顺位排序
        vector<shared_ptr<Team>> draftOrder = teams;
        sort(draftOrder.begin(), draftOrder.end(), 
             [](const shared_ptr<Team>& a, const shared_ptr<Team>& b) {
                 return a->getDraftPick() < b->getDraftPick();
             });
        
        // 模拟首轮
        cout << "\n第一轮:" << endl;
        for (int i = 0; i < 30 && i < static_cast<int>(draftOrder.size()); i++) {
            shared_ptr<Team> team = draftOrder[i];
            int pick = team->getDraftPick();
            
            shared_ptr<Player> draftedPlayer;
            if (team == userTeam) {
                // 用户选择
                cout << "\n轮到你选秀 (#" << pick << "):" << endl;
                draft.displayProspects();
                
                int selection;
                do {
                    cout << "选择要选中的球员 (1-" << draft.getProspects().size() << "): ";
                    cin >> selection;
                    cin.ignore();
                } while (selection < 1 || selection > static_cast<int>(draft.getProspects().size()));
                
                draftedPlayer = draft.draftPlayer(selection);
            } else {
                // AI选择(简单模拟:选择最高能力值的球员)
                vector<shared_ptr<Player>> prospects = draft.getProspects();
                if (prospects.empty()) break;
                
                int bestIndex = 0;
                int bestOverall = prospects[0]->getOverall();
                
                for (size_t j = 1; j < prospects.size(); j++) {
                    if (prospects[j]->getOverall() > bestOverall) {
                        bestOverall = prospects[j]->getOverall();
                        bestIndex = j;
                    }
                }
                
                draftedPlayer = draft.draftPlayer(bestIndex + 1);
                cout << "第" << pick << "号签: " << team->getCity() << " " << team->getName() 
                     << " 选中 " << draftedPlayer->getName() << " (" << draftedPlayer->getPosition() 
                     << ", 能力值: " << draftedPlayer->getOverall() << ")" << endl;
            }
            
            if (draftedPlayer) {
                // 添加球员到球队
                team->addPlayer(draftedPlayer);
                cout << team->getCity() << " " << team->getName() << " 选中了 " 
                     << draftedPlayer->getName() << " (" << draftedPlayer->getPosition() 
                     << ", 能力值: " << draftedPlayer->getOverall() << ", 潜力: " 
                     << draftedPlayer->getPotential() << ")" << endl;
            }
        }
        
        // 模拟次轮
        cout << "\n第二轮:" << endl;
        for (int i = 0; i < 30 && i < static_cast<int>(draftOrder.size()); i++) {
            shared_ptr<Team> team = draftOrder[i];
            
            vector<shared_ptr<Player>> prospects = draft.getProspects();
            if (prospects.empty()) {
                cout << "次轮没有更多新秀可供选择。" << endl;
                break;
            }
            
            shared_ptr<Player> draftedPlayer;
            if (team == userTeam) {
                // 用户选择
                cout << "\n轮到你选秀 (#" << (i + 31) << "):" << endl;
                draft.displayProspects();
                
                int selection;
                do {
                    cout << "选择要选中的球员 (1-" << prospects.size() << "): ";
                    cin >> selection;
                    cin.ignore();
                } while (selection < 1 || selection > static_cast<int>(prospects.size()));
                
                draftedPlayer = draft.draftPlayer(selection);
            } else {
                // AI选择(简单模拟)
                int randomIndex = rand() % prospects.size();
                draftedPlayer = draft.draftPlayer(randomIndex + 1);
            }
            
            if (draftedPlayer) {
                // 添加球员到球队
                team->addPlayer(draftedPlayer);
                cout << team->getCity() << " " << team->getName() << " 选中了 " 
                     << draftedPlayer->getName() << " (" << draftedPlayer->getPosition() 
                     << ", 能力值: " << draftedPlayer->getOverall() << ")" << endl;
            }
        }
    }

    void ageAllPlayers() {
        for (const auto& team : teams) {
            team->ageRoster();
        }
    }

    void handleExpiringContracts() {
        cout << "\n处理即将到期的合同..." << endl;
        
        for (const auto& team : teams) {
            vector<shared_ptr<Player>> expiringPlayers;
            vector<shared_ptr<Player>> roster = team->getRoster();
            
            for (const auto& player : roster) {
                if (player->getContractYears() == 1) {
                    expiringPlayers.push_back(player);
                } else {
                    // 减少合同年数
                    player->setContractYears(player->getContractYears() - 1);
                }
            }
            
            // 处理用户球队的续约决定
            if (team == userTeam) {
                cout << "\n你球队即将到期的合同:" << endl;
                for (const auto& player : expiringPlayers) {
                    player->displayInfo();
                    
                    char choice;
                    do {
                        cout << "你想续约" << player->getName() << "吗? (y/n): ";
                        cin >> choice;
                        cin.ignore();
                    } while (choice != 'y' && choice != 'n');
                    
                    if (choice == 'y') {
                        // 续约逻辑
                        int newYears;
                        double newSalary;
                        
                        cout << "输入合同年数 (1-5): ";
                        cin >> newYears;
                        cin.ignore();
                        
                        // 根据球员能力计算合理薪资
                        double baseSalary = (player->getOverall() - 55) * 1000000;
                        
                        cout << "建议薪资: $" << baseSalary / 1000000 << "百万/年" << endl;
                        cout << "输入新薪资 (单位: 百万): ";
                        cin >> newSalary;
                        cin.ignore();
                        
                        newSalary *= 1000000; // 转换为美元
                        
                        // 检查薪资帽
                        if (team->getCurrentSalary() - player->getSalary() + newSalary <= team->getSalaryCap()) {
                            player->setContractYears(newYears);
                            player->setSalary(newSalary);
                            cout << player->getName() << " 以" << newYears 
                                 << "年 $" << newSalary / 1000000 << "百万/年的合同续约。" << endl;
                        } else {
                            cout << "薪资帽违规! 合同报价被拒绝。" << endl;
                            team->removePlayer(player);
                            cout << player->getName() << " 已离开球队。" << endl;
                        }
                    } else {
                        team->removePlayer(player);
                        cout << player->getName() << " 已离开球队。" << endl;
                    }
                }
            } else {
                // AI球队处理续约
                for (const auto& player : expiringPlayers) {
                    // 简单AI逻辑:根据球员能力和球队需求决定是否续约
                    random_device rd;
                    mt19937 gen(rd());
                    uniform_real_distribution<> dis(0.0, 1.0);
                    
                    double resignProbability = 0.5;
                    
                    // 能力强的球员更可能被续约
                    if (player->getOverall() > 80) {
                        resignProbability += 0.3;
                    } else if (player->getOverall() > 70) {
                        resignProbability += 0.15;
                    }
                    
                    // 检查球队位置需求(简化)
                    int positionCount = 0;
                    for (const auto& p : roster) {
                        if (p->getPosition() == player->getPosition() && p != player) {
                            positionCount++;
                        }
                    }
                    
                    if (positionCount >= 2) {
                        resignProbability -= 0.2;
                    }
                    
                    // 薪资帽考虑
                    double newSalary = (player->getOverall() - 55) * 1000000;
                    if (team->getCurrentSalary() - player->getSalary() + newSalary > team->getSalaryCap()) {
                        resignProbability -= 0.3;
                    }
                    
                    resignProbability = max(0.0, min(1.0, resignProbability));
                    
                    if (dis(gen) < resignProbability) {
                        // 续约
                        int newYears = 2 + (rand() % 4); // 2-5年
                        player->setContractYears(newYears);
                        player->setSalary(newSalary);
                    } else {
                        // 不续约
                        team->removePlayer(player);
                    }
                }
            }
        }
    }

    void displayUserTeamRoster() const {
        userTeam->displayRoster();
    }

    void tradePlayers() {
        cout << "\n交易中心" << endl;
        cout << "----------------------------------------" << endl;
        
        // 显示用户球队可交易球员
        cout << "\n你球队的可交易球员:" << endl;
        vector<shared_ptr<Player>> yourTradeablePlayers = userTeam->getTradeablePlayers();
        for (size_t i = 0; i < yourTradeablePlayers.size(); i++) {
            cout << i + 1 << ". ";
            yourTradeablePlayers[i]->displayInfo();
        }
        
        // 选择交易对象球队
        cout << "\n选择要交易的球队:" << endl;
        for (size_t i = 0; i < teams.size(); i++) {
            if (teams[i] != userTeam) {
                cout << i + 1 << ". " << teams[i]->getCity() << " " << teams[i]->getName() 
                     << " (战绩: " << teams[i]->getWins() << "-" << teams[i]->getLosses() << ")" << endl;
            }
        }
        
        int teamChoice;
        do {
            cout << "输入球队编号 (1-30, 不包括你自己的球队): ";
            cin >> teamChoice;
            cin.ignore();
        } while (teamChoice < 1 || teamChoice > 30 || teams[teamChoice - 1] == userTeam);
        
        shared_ptr<Team> tradePartner = teams[teamChoice - 1];
        
        // 显示交易对象球队可交易球员
        cout << "\n" << tradePartner->getCity() << " " << tradePartner->getName() << "的可交易球员:" << endl;
        vector<shared_ptr<Player>> partnerTradeablePlayers = tradePartner->getTradeablePlayers();
        for (size_t i = 0; i < partnerTradeablePlayers.size(); i++) {
            cout << i + 1 << ". ";
            partnerTradeablePlayers[i]->displayInfo();
        }
        
        // 选择要交易的球员
        vector<shared_ptr<Player>> playersToTrade;
        char addMore;
        
        do {
            int playerChoice;
            do {
                cout << "\n从你的球队中选择要交易的球员 (1-" << yourTradeablePlayers.size() << "), 0 结束: ";
                cin >> playerChoice;
                cin.ignore();
            } while (playerChoice < 0 || playerChoice > static_cast<int>(yourTradeablePlayers.size()));
            
            if (playerChoice > 0) {
                playersToTrade.push_back(yourTradeablePlayers[playerChoice - 1]);
                cout << yourTradeablePlayers[playerChoice - 1]->getName() << " 已添加到交易包中。" << endl;
            }
            
            if (playerChoice > 0) {
                cout << "添加另一名球员? (y/n): ";
                cin >> addMore;
                cin.ignore();
            } else {
                addMore = 'n';
            }
        } while (addMore == 'y');
        
        // 计算交易球员的总薪资
        double yourPlayersSalary = 0;
        for (const auto& player : playersToTrade) {
            yourPlayersSalary += player->getSalary();
        }
        
        // 选择想要得到的球员
        vector<shared_ptr<Player>> playersToReceive;
        
        do {
            int playerChoice;
            do {
                cout << "\n从" << tradePartner->getCity() << " " 
                     << tradePartner->getName() << "选择想要得到的球员 (1-" << partnerTradeablePlayers.size() << "), 0 结束: ";
                cin >> playerChoice;
                cin.ignore();
            } while (playerChoice < 0 || playerChoice > static_cast<int>(partnerTradeablePlayers.size()));
            
            if (playerChoice > 0) {
                playersToReceive.push_back(partnerTradeablePlayers[playerChoice - 1]);
                cout << partnerTradeablePlayers[playerChoice - 1]->getName() << " 已添加到接收包中。" << endl;
            }
            
            if (playerChoice > 0) {
                cout << "添加另一名球员? (y/n): ";
                cin >> addMore;
                cin.ignore();
            } else {
                addMore = 'n';
            }
        } while (addMore == 'y');
        
        // 计算接收球员的总薪资
        double receivePlayersSalary = 0;
        for (const auto& player : playersToReceive) {
            receivePlayersSalary += player->getSalary();
        }
        
        // 显示交易摘要
        cout << "\n交易摘要:" << endl;
        cout << "你交易出:" << endl;
        for (const auto& player : playersToTrade) {
            cout << "- " << player->getName() << " ($" << player->getSalary() / 1000000 << "百万/年)" << endl;
        }
        cout << "总薪资: $" << yourPlayersSalary / 1000000 << "百万/年" << endl;
        
        cout << "\n你交易得到:" << endl;
        for (const auto& player : playersToReceive) {
            cout << "- " << player->getName() << " ($" << player->getSalary() / 1000000 << "百万/年)" << endl;
        }
        cout << "总薪资: $" << receivePlayersSalary / 1000000 << "百万/年" << endl;
        
        // 简单的薪资匹配检查(NBA规则:交易薪资需大致匹配)
        bool salaryMatch = true;
        if (yourPlayersSalary > 0 && receivePlayersSalary > 0) {
            double ratio = max(yourPlayersSalary, receivePlayersSalary) / min(yourPlayersSalary, receivePlayersSalary);
            if (ratio > 1.25) { // 简化规则:薪资差异不超过25%
                salaryMatch = false;
                cout << "\n警告: 薪资不匹配! 根据NBA规则,这笔交易可能不被允许。" << endl;
            }
        }
        
        // 检查薪资帽
        double newUserSalary = userTeam->getCurrentSalary() - yourPlayersSalary + receivePlayersSalary;
        if (newUserSalary > userTeam->getSalaryCap()) {
            cout << "\n警告: 这笔交易会使你的球队超过薪资帽!" << endl;
        }
        
        char confirm;
        do {
            cout << "\n确认交易? (y/n): ";
            cin >> confirm;
            cin.ignore();
        } while (confirm != 'y' && confirm != 'n');
        
        if (confirm == 'y' && salaryMatch) {
            // 执行交易
            for (const auto& player : playersToTrade) {
                userTeam->removePlayer(player);
                tradePartner->addPlayer(player);
            }
            
            for (const auto& player : playersToReceive) {
                tradePartner->removePlayer(player);
                userTeam->addPlayer(player);
            }
            
            cout << "\n交易完成!" << endl;
            cout << "你更新后的阵容:" << endl;
            displayUserTeamRoster();
        } else {
            cout << "\n交易取消。" << endl;
        }
    }

    void freeAgency() {
        cout << "\n自由球员市场" << endl;
        cout << "----------------------------------------" << endl;
        
        // 生成自由球员池
        vector<shared_ptr<Player>> freeAgents;
        
        // 从其他球队中随机选择一些球员作为自由球员
        for (const auto& team : teams) {
            if (team == userTeam) continue;
            
            vector<shared_ptr<Player>> roster = team->getRoster();
            for (const auto& player : roster) {
                // 随机概率成为自由球员
                random_device rd;
                mt19937 gen(rd());
                uniform_int_distribution<> dis(1, 100);
                
                if (dis(gen) <= 10) { // 10%的概率
                    freeAgents.push_back(player);
                }
            }
        }
        
        // 添加一些新秀级别的自由球员
        vector<string> firstNames = {"约翰", "迈克尔", "大卫", "詹姆斯", "罗伯特", "丹尼尔", "马修", "安德鲁", "约瑟夫", "瑞安", 
                                     "贾斯汀", "布兰登", "克里斯托弗", "托马斯", "乔纳森", "凯文", "布莱恩", "爱德华", "贾森", "蒂莫西"};
        vector<string> lastNames = {"史密斯", "约翰逊", "威廉姆斯", "琼斯", "布朗", "戴维斯", "米勒", "威尔逊", "摩尔", "泰勒", 
                                    "安德森", "托马斯", "杰克逊", "怀特", "哈里斯", "马丁", "汤普森", "加西亚", "马丁内斯", "罗宾逊"};
        vector<string> positions = {"控球后卫", "得分后卫", "小前锋", "大前锋", "中锋"};
        
        for (int i = 0; i < 10; i++) {
            string name = firstNames[rand() % firstNames.size()] + " " + lastNames[rand() % lastNames.size()];
            string position = positions[rand() % positions.size()];
            int age = 22 + (rand() % 6);
            int overall = 55 + (rand() % 15);
            int potential = overall + (rand() % 10);
            
            auto player = make_shared<Player>(name, age, position, overall, potential, 0, 0);
            freeAgents.push_back(player);
        }
        
        // 显示自由球员
        cout << "\n可用的自由球员:" << endl;
        for (size_t i = 0; i < freeAgents.size(); i++) {
            cout << i + 1 << ". ";
            freeAgents[i]->displayInfo();
        }
        
        // 签约自由球员
        char continueSigning = 'y';
        while (continueSigning == 'y') {
            int choice;
            do {
                cout << "\n选择要签约的自由球员 (1-" << freeAgents.size() << "), 0 退出: ";
                cin >> choice;
                cin.ignore();
            } while (choice < 0 || choice > static_cast<int>(freeAgents.size()));
            
            if (choice == 0) break;
            
            shared_ptr<Player> selectedPlayer = freeAgents[choice - 1];
            
            // 确定合同条款
            int years;
            double salary;
            
            cout << "\n输入合同年数 (1-5): ";
            cin >> years;
            cin.ignore();
            
            // 根据球员能力建议薪资
            double suggestedSalary = (selectedPlayer->getOverall() - 55) * 1000000;
            cout << "建议薪资: $" << suggestedSalary / 1000000 << "百万/年" << endl;
            
            cout << "输入薪资 (单位: 百万): ";
            cin >> salary;
            cin.ignore();
            
            salary *= 1000000; // 转换为美元
            
            // 检查薪资帽
            if (userTeam->getCurrentSalary() + salary > userTeam->getSalaryCap()) {
                cout << "薪资帽违规! 你负担不起这名球员的薪水。" << endl;
            } else {
                // 检查球员是否属于其他球队
                bool fromOtherTeam = false;
                for (const auto& team : teams) {
                    if (team == userTeam) continue;
                    
                    vector<shared_ptr<Player>> roster = team->getRoster();
                    for (const auto& player : roster) {
                        if (player == selectedPlayer) {
                            team->removePlayer(player);
                            fromOtherTeam = true;
                            break;
                        }
                    }
                    if (fromOtherTeam) break;
                }
                
                // 设置球员合同
                selectedPlayer->setContractYears(years);
                selectedPlayer->setSalary(salary);
                
                // 添加到用户球队
                userTeam->addPlayer(selectedPlayer);
                
                // 从自由球员列表中移除
                freeAgents.erase(freeAgents.begin() + choice - 1);
                
                cout << selectedPlayer->getName() << " 已与" 
                     << userTeam->getCity() << " " << userTeam->getName() 
                     << "签约,合同为" << years << "年,年薪为$" << salary / 1000000 << "百万!" << endl;
            }
            
            if (!freeAgents.empty()) {
                cout << "\n继续签约自由球员? (y/n): ";
                cin >> continueSigning;
                cin.ignore();
            } else {
                cout << "\n没有更多自由球员可用。" << endl;
                continueSigning = 'n';
            }
        }
        
        // 显示更新后的阵容
        cout << "\n你更新后的阵容:" << endl;
        displayUserTeamRoster();
    }

    void gameMenu() {
        int choice;
        do {
            cout << "\n===== NBA经理游戏菜单 =====" << endl;
            cout << "1. 显示球队阵容" << endl;
            cout << "2. 模拟赛季" << endl;
            cout << "3. 交易球员" << endl;
            cout << "4. 签约自由球员" << endl;
            cout << "5. 查看联盟排名" << endl;
            cout << "0. 退出游戏" << endl;
            cout << "===========================" << endl;
            cout << "请选择: ";
            cin >> choice;
            cin.ignore();
            
            switch (choice) {
                case 1:
                    displayUserTeamRoster();
                    break;
                case 2:
                    simulateSeason();
                    break;
                case 3:
                    tradePlayers();
                    break;
                case 4:
                    freeAgency();
                    break;
                case 5:
                    displayStandings();
                    break;
                case 0:
                    cout << "感谢游玩NBA经理游戏!" << endl;
                    gameOver = true;
                    break;
                default:
                    cout << "无效选择,请重试。" << endl;
            }
        } while (!gameOver);
    }
};

int main() {
    // 设置随机数种子
    srand(static_cast<unsigned int>(time(nullptr)));
    
    // 创建并开始游戏
    NBAGame game;
    game.gameMenu();
    
    return 0;
}