• 个人简介

    W       W  EEEEE  L       L  CCCC    OOOOO    M     M
    W       W  E      L       L  C    C  O     O   M M M M
    W   W   W  EEEE   L       L  C        O     O  M   M   M
     W W W W   E      L       L  C        O     O  M         M
      W   W    EEEEE  LLLLLLL  L  CCCC    OOOOO    M           M
    
      CCCC    H     H    EEEEE    N     N    ZZZZZZZ    H     H    AAAAA    N     N
     C    C   H     H    E        N N   N    Z         H     H   A     A   N N   N
    C        H     H    EEEE     N  N  N    Z        HHHHHHH  AAAAAAA  N  N  N
    C        H     H    E        N   N N    Z Z Z Z  H     H  A     A  N   N N
     C    C   H     H    E        N    NN    Z     Z  H     H  A     A  N    NN
      CCCC     HHHHH     EEEEE    N     N    ZZZZZZZ  H     H   AAAAA   N     N
    

    xiaoshuo

    	_      _      _  
       / /    / /    / /
      / /    / /    / /
     / __\  / __\  / __\
     ||_| |	||_| | ||_| |
     \___/	\___/  \___/
    
    

    小程序 狼人杀:

    #include<bits/stdc++.h>
    #include<windows.h>
    #include<conio.h>
    using namespace std;
    
    // 1. 补充缺失的枚举定义(核心修复)
    enum Phase { DAY = 0, NIGHT = 1 };       // 昼夜阶段
    enum Role {
        VILLAGER = 0,    // 村民
        WEREWOLF = 1,    // 狼人
        SEER = 2,        // 预言家
        WITCH = 3,       // 女巫
        HUNTER = 4,      // 猎人
        GUARD = 5,       // 守卫
        GOOD = 6         // 好人投票(用于标记死因)
    };
    enum Color {
        RED, GREEN, YELLOW, BLUE, WHITE, PURPLE  // 控制台颜色
    };
    enum Status { DEAD = 1, ALIVE = 2 };        // 玩家状态
    
    // 全局变量
    int wolf_kill = -1;        // 狼人击杀目标
    int day = 0;               // 当前天数
    Phase current_phase = DAY; // 当前阶段(修复:用定义的枚举)
    int player_count;          // 玩家总数
    int my_seat;               // 自己的座位号
    HWND hwnd = GetForegroundWindow();
    int police_seat = -1;      // 警长座位号
    int wolf_count = 0;        // 狼人数量
    int witch_seat = -1, guard_seat = -1, seer_seat = -1, hunter_seat = -1;
    int wolf_seats[4] = {-1, -1, -1, -1};  // 狼人座位号
    bool witch_healed = false; // 女巫是否用过解药
    bool witch_poisoned = false;// 女巫是否用过毒药
    int heal_target = -1;      // 解药目标
    int poison_target = -1;    // 毒药目标
    int guard_protect = -1;    // 守卫守护目标
    int seer_check_target = -1;// 预言家查验目标
    
    // 玩家结构体(修复:Role枚举已定义)
    struct Player {
        Role role = (Role)-1;       
        Status status = ALIVE;      
        bool known = false;         
        int killer = INT_MAX;       
    };
    Player players[100];
    
    // 控制台颜色设置(修复:Color枚举已定义)
    void set_color(Color c) {
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        switch(c) {
            case RED: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED); break;
            case GREEN: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_GREEN); break;
            case YELLOW: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); break;
            case BLUE: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_BLUE); break;
            case WHITE: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); break;
            case PURPLE: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); break;
        }
    }
    
    // 控制台光标定位
    void gotoxy(int x, int y) {
        COORD pos = { (SHORT)x, (SHORT)y };
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    }
    
    // 初始化窗口
    void init_window() {
        system("mode con lines=60 cols=188"); 
        ShowWindow(hwnd, SW_MAXIMIZE);
        DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND);
        DrawMenuBar(GetConsoleWindow());
    }
    
    // 检查数组是否包含指定值
    bool array_contains(int arr[], int val, int len) {
        for(int i = 0; i < len; i++) {
            if(arr[i] == val) return true;
        }
        return false;
    }
    
    // 随机选一个存活玩家(可排除指定身份)
    int rand_alive_player(Role exclude_role = (Role)-1) {
        int target = -1;
        while(true) {
            target = rand() % player_count;
            if(players[target].status == ALIVE && players[target].role != exclude_role) {
                break;
            }
        }
        return target;
    }
    
    // 初始化玩家身份
    void init_players() {
        // 确定狼人数量
        if(player_count == 12) wolf_count = 4;
        else if(player_count >= 10) wolf_count = 3;
        else wolf_count = 2;
    
        // 初始化所有玩家
        for(int i = 0; i < player_count; i++) {
            players[i].status = ALIVE;
            players[i].known = false;
            players[i].killer = INT_MAX;
            players[i].role = (Role)-1;
        }
    
        // 分配狼人身份
        int wolf_idx = 0;
        while(wolf_idx < wolf_count) {
            int seat = rand() % player_count;
            if(!array_contains(wolf_seats, seat, 4)) {
                wolf_seats[wolf_idx++] = seat;
                players[seat].role = WEREWOLF;
            }
            Sleep(rand() % 80 + 100);
        }
    
        // 分配守卫(仅12人局)
        if(player_count == 12) {
            do { guard_seat = rand() % player_count; }
            while(players[guard_seat].role != (Role)-1);
            players[guard_seat].role = GUARD;
        }
    
        // 分配女巫
        do { witch_seat = rand() % player_count; }
        while(players[witch_seat].role != (Role)-1);
        players[witch_seat].role = WITCH;
    
        // 分配猎人(≥10人局)
        if(player_count >= 10) {
            do { hunter_seat = rand() % player_count; }
            while(players[hunter_seat].role != (Role)-1);
            players[hunter_seat].role = HUNTER;
        }
    
        // 分配预言家
        do { seer_seat = rand() % player_count; }
        while(players[seer_seat].role != (Role)-1);
        players[seer_seat].role = SEER;
    
        // 剩余玩家为村民
        for(int i = 0; i < player_count; i++) {
            if(players[i].role == (Role)-1) {
                players[i].role = VILLAGER;
            }
        }
    
        // 随机分配自己的座位,并标记已知身份
        my_seat = rand() % player_count;
        players[my_seat].known = true;
        if(players[my_seat].role == WEREWOLF) {
            // 狼人可见所有狼队友
            for(int i = 0; i < wolf_count; i++) {
                players[wolf_seats[i]].known = true;
            }
        }
    }
    
    // 绘制游戏UI
    void print_ui() {
        gotoxy(0, 0);
        set_color(WHITE);
        cout << "作者:chenzhan";
        
        gotoxy(90, 0);
        if(current_phase == NIGHT) set_color(RED);
        else set_color(BLUE);
        printf("第%d天 | %s\n", day, current_phase == NIGHT ? "黑夜" : "白天");
    
        gotoxy(0, 3);
        set_color(BLUE);
        cout << " 我的号位:" << my_seat + 1;
    
        // 绘制所有玩家状态
        for(int i = 0; i < player_count; i++) {
            gotoxy(i * 8 + 1, 4);
            if(i == police_seat) set_color(YELLOW);
            else set_color(BLUE);
            cout << i + 1 << "号位";
    
            gotoxy(i * 8 + 1, 5);
            if(players[i].status == DEAD) {
                set_color(RED);
                cout << "死 亡";
            } else {
                set_color(GREEN);
                cout << "存 活";
            }
    
            gotoxy(i * 8 + 1, 6);
            set_color(BLUE);
            if(players[i].known) {
                switch(players[i].role) {
                    case WITCH: cout << "女 巫"; break;
                    case SEER: cout << "预言家"; break;
                    case VILLAGER: cout << "村 民"; break;
                    case WEREWOLF: cout << "狼 人"; break;
                    case HUNTER: cout << "猎 人"; break;
                    case GUARD: cout << "守 卫"; break;
                    default: cout << "好人";
                }
            } else {
                cout << "未知";
            }
        }
        set_color(WHITE); 
    }
    
    // 检查游戏是否结束
    int check_game_end() {
        int dead_wolf = 0, dead_villager = 0, dead_god = 0;
        int alive_wolf = 0, alive_good = 0;
    
        for(int i = 0; i < player_count; i++) {
            if(players[i].status == DEAD) {
                if(players[i].role == WEREWOLF) dead_wolf++;
                else if(players[i].role == VILLAGER) dead_villager++;
                else dead_god++; // 神牌(女巫/预言家/猎人/守卫)
            } else {
                if(players[i].role == WEREWOLF) alive_wolf++;
                else alive_good++;
            }
        }
    
        // 狼人全灭 → 好人胜利
        if(alive_wolf == 0) return 1;
    
        // 计算神牌总数和村民总数
        int god_total = (witch_seat != -1) + (seer_seat != -1) + (hunter_seat != -1) + (guard_seat != -1);
        int villager_total = player_count - god_total - wolf_count;
    
        // 神牌全灭 或 村民全灭 → 狼人胜利
        if(dead_god >= god_total || dead_villager >= villager_total) return 2;
    
        // 狼人数 = 好人数 → 平局
        if(alive_wolf == alive_good) return 3;
    
        // 游戏继续
        return 0;
    }
    
    // 游戏初始化阶段
    void pre_game() {
        srand(time(NULL));
        init_window();
    
        set_color(GREEN);
        cout << "欢迎来到狼人杀游戏\t\t\t注:10/11/12人局开设猎人  12人局开设守卫/警长\n";
        cout << "----------------------------------------\n";
        cout << "请输入玩家人数(8-12人): ";
        cin >> player_count;
        while(player_count < 8 || player_count > 12) {
            cout << "人数不符合要求,请重新输入(8-12): ";
            cin >> player_count;
        }
    
        system("cls");
        cout << "初始化身份中,请稍等.";
        for(int i = 0; i < 6; i++) {
            for(int j = 0; j < 12; j++) {
                cout << ".";
                Sleep(50);
            }
            cout << "\b\b\b\b\b\b\b\b\b\b\b\b            \b\b\b\b\b\b\b\b\b\b\b\b";
        }
    
        system("cls");
        init_players();
        cout << "我的号位: " << my_seat + 1 << endl;
        cout << "我的身份: ";
        switch(players[my_seat].role) {
            case WITCH: cout << "女巫\n"; break;
            case SEER: cout << "预言家\n"; break;
            case VILLAGER: cout << "村民\n"; break;
            case WEREWOLF: cout << "狼人\n"; break;
            case HUNTER: cout << "猎人\n"; break;
            case GUARD: cout << "守卫\n"; break;
        }
    
        current_phase = DAY;
        day = 1; 
        system("pause");
    
        system("cls");
        cout << "游戏加载中.";
        int load_times = rand() % 3 + 2;
        for(int i = 0; i < load_times; i++) {
            for(int j = 0; j < 6; j++) {
                cout << ".";
                Sleep(rand() % 100 + 150);
            }
            cout << "\b\b\b\b\b\b      \b\b\b\b\b\b";
        }
    
        system("cls");
        print_ui();
    }
    
    // 守卫行动阶段
    void guard_action() {
        set_color(BLUE);
        cout << "守卫~请睁眼~~\n";
        Sleep(1500);
        guard_protect = -1;
    
        if(players[my_seat].role == GUARD && players[my_seat].status == ALIVE) {
            cout << "你要守护的是? (输入座位号1-" << player_count << "): ";
            cin >> guard_protect;
            guard_protect--; // 转成0索引
            while(guard_protect < 0 || guard_protect >= player_count || players[guard_protect].status == DEAD) {
                cout << "输入无效,请重新输入存活玩家的座位号: ";
                cin >> guard_protect;
                guard_protect--;
            }
            cout << "你今晚要守护的是" << guard_protect + 1 << "号\n";
        } else if(guard_seat != -1 && players[guard_seat].status == ALIVE) {
            // AI守卫随机守护
            guard_protect = rand_alive_player();
        }
    
        Sleep(2000);
        cout << "守卫请闭眼\n\n";
    }
    
    // 狼人行动阶段(返回击杀目标)
    int wolf_action() {
        set_color(RED);
        cout << "狼人~请睁眼~~~\n";
        Sleep(1500);
        int kill_target = -1;
    
        if(players[my_seat].role == WEREWOLF && players[my_seat].status == ALIVE) {
            cout << "你们今晚要杀谁?(输入座位号1-" << player_count << "): ";
            cin >> kill_target;
            kill_target--;
            while(kill_target < 0 || kill_target >= player_count || players[kill_target].status == DEAD || players[kill_target].role == WEREWOLF) {
                cout << "输入无效,请重新输入非狼人存活玩家的座位号: ";
                cin >> kill_target;
                kill_target--;
            }
            cout << "你们今晚要杀的是" << kill_target + 1 << "号\n";
        } else {
            // AI狼人随机击杀(排除狼人)
            kill_target = rand_alive_player(WEREWOLF);
        }
    
        Sleep(3500);
        cout << "狼人请~闭眼~~\n\n";
        return kill_target;
    }
    
    // 女巫行动阶段
    void witch_action(int wolf_kill) {
        set_color(PURPLE);
        cout << "女巫~~请睁眼~~\n";
        Sleep(2000);
        heal_target = -1;
        poison_target = -1;
    
        if(players[my_seat].role == WITCH && players[my_seat].status == ALIVE) {
            // 解药环节
            if(!witch_healed) {
                cout << "今晚" << wolf_kill + 1 << "号被狼人杀死,你想用解药吗?(1=想 / 2=不想): ";
                int choice;
                cin >> choice;
                while(choice != 1 && choice != 2) {
                    cout << "输入无效,请输入1或2: ";
                    cin >> choice;
                }
                if(choice == 1) {
                    heal_target = wolf_kill;
                    witch_healed = true;
                    cout << "已解救" << wolf_kill + 1 << "号\n";
                }
            } else {
                cout << "你已经用过解药\n";
                Sleep(1500);
            }
    
            Sleep(1500);
    
            // 毒药环节
            if(!witch_poisoned) {
                cout << "你想用毒药吗?(1=想 / 2=不想): ";
                int choice;
                cin >> choice;
                while(choice != 1 && choice != 2) {
                    cout << "输入无效,请输入1或2: ";
                    cin >> choice;
                }
                if(choice == 1) {
                    cout << "你想毒谁?(输入座位号1-" << player_count << "): ";
                    cin >> poison_target;
                    poison_target--;
                    while(poison_target < 0 || poison_target >= player_count || players[poison_target].status == DEAD) {
                        cout << "输入无效,请重新输入存活玩家的座位号: ";
                        cin >> poison_target;
                        poison_target--;
                    }
                    witch_poisoned = true;
                    cout << "已毒死" << poison_target + 1 << "号\n";
                }
            } else {
                cout << "你已经用过毒药\n";
                Sleep(1500);
            }
        } else if(players[witch_seat].status == ALIVE) {
            // AI女巫随机使用解药/毒药
            if(!witch_healed && rand() % 10 == 0) { // 10%概率用解药
                heal_target = wolf_kill;
                witch_healed = true;
            }
            if(!witch_poisoned && rand() % 4 == 0) { // 25%概率用毒药
                poison_target = rand_alive_player();
                witch_poisoned = true;
            }
        }
    
        Sleep(1500);
        cout << "女巫~请闭眼~~\n\n";
    }
    
    // 预言家行动阶段
    void seer_action() {
        set_color(GREEN);
        cout << "预言家~请睁眼~~\n";
        Sleep(2000);
        seer_check_target = -1;
    
        if(players[my_seat].role == SEER && players[my_seat].status == ALIVE) {
            cout << "你想查验谁的身份?(输入座位号1-" << player_count << "): ";
            int check;
            cin >> check;
            check--;
            while(check < 0 || check >= player_count || players[check].status == DEAD) {
                cout << "输入无效,请重新输入存活玩家的座位号: ";
                cin >> check;
                check--;
            }
    
            Sleep(2000);
            cout << check + 1 << "号的身份是——";
            Sleep(1000);
            if(players[check].role == WEREWOLF) {
                cout << "狼人\n";
                players[check].known = true;
            } else {
                cout << "好人\n";
                players[check].known = true;
            }
        } else if(players[seer_seat].status == ALIVE) {
            // AI预言家随机查验
            seer_check_target = rand_alive_player();
        }
    
        Sleep(1000);
        cout << "预言家~~请闭眼~~\n\n";
    }
    
    // 黑夜阶段总流程
    void night_phase() {
        current_phase = NIGHT;
        system("cls");
        print_ui();
        gotoxy(0, 7);
        cout << "----------------------------------------\n";
        set_color(WHITE);
        cout << "天黑~请闭眼~~~\n";
        Sleep(1500);
    
        // 守卫行动(仅12人局)
        if(player_count == 12) {
            guard_action();
            Sleep(2000);
        }
    
        // 狼人行动
        wolf_kill = wolf_action();
        Sleep(3500);
    
        // 女巫行动
        witch_action(wolf_kill);
        Sleep(3000);
    
        // 预言家行动
        seer_action();
        Sleep(2000);
    
        current_phase = DAY;
    }
    
    // 猎人技能触发
    void hunter_skill(int dead_seat) {
        if(players[dead_seat].role != HUNTER || players[dead_seat].status == ALIVE) return;
    
        set_color(RED);
        cout << dead_seat + 1 << "号是猎人,触发技能!\n";
        Sleep(1000);
        int take_seat = -1;
    
        if(dead_seat == my_seat) {
            cout << "你想带走几号?(输入座位号1-" << player_count << "): ";
            cin >> take_seat;
            take_seat--;
            while(take_seat < 0 || take_seat >= player_count || players[take_seat].status == DEAD) {
                cout << "输入无效,请重新输入存活玩家的座位号: ";
                cin >> take_seat;
                take_seat--;
            }
        } else {
            // AI猎人随机带走
            take_seat = rand_alive_player();
        }
    
        Sleep(2000);
        cout << "猎人选择带走" << take_seat + 1 << "号\n";
        players[take_seat].status = DEAD;
        players[take_seat].killer = HUNTER;
        Sleep(3000);
    }
    
    // 公布夜晚结果
    void announce_night_result() {
        system("cls");
        print_ui();
        gotoxy(0, 7);
        cout << "----------------------------------------\n";
        Sleep(3000);
        set_color(WHITE);
        cout << "天亮了\n";
        Sleep(2000);
    
        vector<int> dead_players;
    
        // 处理狼人击杀(未被守卫守护且未被女巫救)
        if(wolf_kill != -1 && wolf_kill != guard_protect && wolf_kill != heal_target) {
            players[wolf_kill].status = DEAD;
            players[wolf_kill].killer = WEREWOLF;
            dead_players.push_back(wolf_kill);
        }
    
        // 处理女巫毒药
        if(poison_target != -1) {
            players[poison_target].status = DEAD;
            players[poison_target].killer = WITCH;
            dead_players.push_back(poison_target);
        }
    
        // 公布死亡信息
        cout << "昨晚";
        if(dead_players.empty()) {
            cout << "是平安夜\n";
        } else {
            for(int i = 0; i < dead_players.size(); i++) {
                if(i > 0) cout << "和";
                cout << dead_players[i] + 1 << "号";
                if(dead_players[i] == police_seat) {
                    cout << "(警长)";
                }
            }
            cout << "死了\n";
    
            // 触发猎人技能
            for(int seat : dead_players) {
                hunter_skill(seat);
            }
        }
        Sleep(3000);
    }
    
    // 选举警长(仅12人局第一天)
    void elect_police() {
        system("cls");
        print_ui();
        gotoxy(0, 7);
        cout << "----------------------------------------\n";
        set_color(YELLOW);
        cout << "开始选举警长,不能选举自己!\n";
        Sleep(2000);
    
        int votes[100] = {0};
        int cannot_vote[100] = {-1}; 
        int cannot_len = 0;
    
        while(true) {
            memset(votes, 0, sizeof(votes));
    
            // 投票流程
            for(int i = 0; i < player_count; i++) {
                if(players[i].status == DEAD || array_contains(cannot_vote, i, cannot_len)) {
                    continue;
                }
    
                int vote_target = -1;
                if(i == my_seat) {
                    cout << "你要选举谁当警长?(输入座位号1-" << player_count << "): ";
                    cin >> vote_target;
                    vote_target--;
                    while(vote_target < 0 || vote_target >= player_count || vote_target == i || players[vote_target].status == DEAD || array_contains(cannot_vote, vote_target, cannot_len)) {
                        cout << "输入无效,请重新输入: ";
                        cin >> vote_target;
                        vote_target--;
                    }
                    cout << i + 1 << "号选举" << vote_target + 1 << "号\n";
                } else {
                    // AI投票(排除自己、死亡、平票者)
                    do {
                        vote_target = rand() % player_count;
                    } while(vote_target == i || players[vote_target].status == DEAD || array_contains(cannot_vote, vote_target, cannot_len));
                    cout << i + 1 << "号选举" << vote_target + 1 << "号\n";
                }
    
                // 警长票权重2倍(首次选举无警长,此逻辑为后续重选)
                votes[vote_target] += (i == police_seat) ? 2 : 1;
                Sleep(1500);
            }
    
            // 统计最高票
            int max_vote = -1;
            vector<int> max_seats;
            for(int i = 0; i < player_count; i++) {
                if(votes[i] > max_vote) {
                    max_vote = votes[i];
                    max_seats.clear();
                    max_seats.push_back(i);
                } else if(votes[i] == max_vote) {
                    max_seats.push_back(i);
                }
            }
    
            // 唯一最高票 → 当选警长
            if(max_seats.size() == 1) {
                police_seat = max_seats[0];
                cout << "恭喜" << police_seat + 1 << "号当选警长!\n";
                Sleep(3000);
                break;
            } else {
                // 平票 → 重选(平票者不能参与)
                cout << "平票:";
                cannot_len = 0;
                for(int seat : max_seats) {
                    cout << seat + 1 << "号 ";
                    cannot_vote[cannot_len++] = seat;
                }
                cout << "进入重选,平票者不能参与\n";
                Sleep(2000);
            }
        }
    }
    
    // 警长死亡处理(撕毁/移交)
    void police_death() {
        set_color(YELLOW);
        cout << "警长死亡,处理警徽!\n";
        Sleep(1500);
    
        int choice = 1; // 1=撕毁,2=移交
        if(police_seat == my_seat) {
            cout << "你想撕毁警徽还是移交警徽?(1=撕毁 / 2=移交): ";
            cin >> choice;
            while(choice != 1 && choice != 2) {
                cout << "输入无效,请输入1或2: ";
                cin >> choice;
            }
        } else {
            // AI随机选择
            choice = rand() % 2 + 1;
        }
    
        if(choice == 1) {
            cout << "警长选择撕毁警徽\n";
            police_seat = -1;
        } else {
            // 移交给随机存活玩家
            int new_police = rand_alive_player();
            cout << "警长选择把警徽移交给" << new_police + 1 << "号\n";
            police_seat = new_police;
        }
        Sleep(2000);
    }
    
    // 白天投票放逐阶段
    int vote_phase() {
        system("cls");
        print_ui();
        gotoxy(0, 7);
        cout << "----------------------------------------\n";
        set_color(WHITE);
        cout << "进入投票环节,选出要放逐的玩家!\n";
        Sleep(2000);
    
        int votes[100] = {0};
        int cannot_vote[100] = {-1}; 
        int cannot_len = 0;
    
        while(true) {
            memset(votes, 0, sizeof(votes));
    
            // 投票流程
            for(int i = 0; i < player_count; i++) {
                if(players[i].status == DEAD || array_contains(cannot_vote, i, cannot_len)) {
                    continue;
                }
    
                int vote_target = -1;
                if(i == my_seat) {
                    cout << "你要投谁出局?(输入座位号1-" << player_count << "): ";
                    cin >> vote_target;
                    vote_target--;
                    while(vote_target < 0 || vote_target >= player_count || players[vote_target].status == DEAD) {
                        cout << "输入无效,请重新输入: ";
                        cin >> vote_target;
                        vote_target--;
                    }
                    cout << i + 1 << "号投了" << vote_target + 1 << "号";
                    if(i == police_seat) cout << "(警长,2票)";
                    cout << endl;
                } else {
                    // AI投票逻辑
                    do {
                        vote_target = rand() % player_count;
                        // 预言家会投自己查验出的狼人
                        if(i == seer_seat && seer_check_target != -1 && players[seer_check_target].role == WEREWOLF) {
                            vote_target = seer_check_target;
                            seer_check_target = -1;
                            break;
                        }
                        // 狼人不会投狼队友
                        if(array_contains(wolf_seats, i, wolf_count) && players[vote_target].role == WEREWOLF) {
                            vote_target = -1;
                            continue;
                        }
                    } while(vote_target == -1 || players[vote_target].status == DEAD);
    
                    cout << i + 1 << "号投了" << vote_target + 1 << "号";
                    if(i == police_seat) cout << "(警长,2票)";
                    cout << endl;
                }
    
                // 警长票权重2倍
                votes[vote_target] += (i == police_seat) ? 2 : 1;
                Sleep(rand() % 1000 + 1000);
            }
    
            // 统计最高票
            int max_vote = -1;
            vector<int> max_seats;
            for(int i = 0; i < player_count; i++) {
                if(votes[i] > max_vote) {
                    max_vote = votes[i];
                    max_seats.clear();
                    max_seats.push_back(i);
                } else if(votes[i] == max_vote) {
                    max_seats.push_back(i);
                }
            }
    
            // 唯一最高票 → 出局
            if(max_seats.size() == 1) {
                int out_seat = max_seats[0];
                cout << out_seat + 1 << "号获得最高票,出局!\n";
                players[out_seat].status = DEAD;
                players[out_seat].killer = GOOD;
                Sleep(4000);
    
                // 处理警长出局
                if(out_seat == police_seat) {
                    police_death();
                }
    
                // 触发猎人技能
                hunter_skill(out_seat);
                return out_seat;
            } else {
                // 平票 → 重选(平票者不能参与)
                cout << "平票:";
                cannot_len = 0;
                for(int seat : max_seats) {
                    cout << seat + 1 << "号 ";
                    cannot_vote[cannot_len++] = seat;
                }
                cout << "进入重选!\n";
                Sleep(3000);
            }
        }
    }
    
    // 游戏结束结算
    void game_over() {
        system("cls");
        set_color(WHITE);
        int result = check_game_end();
        switch(result) {
            case 1: cout << "🎉 好人阵营胜利!🎉\n\n"; break;
            case 2: cout << "🐺 狼人阵营胜利!🐺\n\n"; break;
            case 3: cout << "🤝 本局平局!🤝\n\n"; break;
        }
    
        cout << "===== 最终结算 =====\n";
        for(int i = 0; i < player_count; i++) {
            cout << i + 1 << "号位: \t";
            switch(players[i].role) {
                case WITCH: cout << "女巫\t"; break;
                case SEER: cout << "预言家\t"; break;
                case VILLAGER: cout << "村民\t"; break;
                case WEREWOLF: cout << "狼人\t"; break;
                case HUNTER: cout << "猎人\t"; break;
                case GUARD: cout << "守卫\t"; break;
            }
            cout << "最终: ";
            if(players[i].status == ALIVE) {
                cout << "存活\n";
            } else {
                switch(players[i].killer) {
                    case WEREWOLF: cout << "被狼人杀死\n"; break;
                    case WITCH: cout << "被女巫毒死\n"; break;
                    case GOOD: cout << "被投票出局\n"; break;
                    case HUNTER: cout << "被猎人带走\n"; break;
                    default: cout << "死亡(未知原因)\n";
                }
            }
        }
        set_color(WHITE);
    }
    
    // 主函数
    int main() {
        // 循环2局游戏(可修改次数)
        for(int i=0; i<=1; i++) {
            // 重置全局变量(避免多局数据污染)
            wolf_kill = -1;
            day = 0;
            current_phase = DAY;
            police_seat = -1;
            wolf_count = 0;
            witch_seat = -1;
            guard_seat = -1;
            seer_seat = -1;
            hunter_seat = -1;
            memset(wolf_seats, -1, sizeof(wolf_seats));
            witch_healed = false;
            witch_poisoned = false;
            heal_target = -1;
            poison_target = -1;
            guard_protect = -1;
            seer_check_target = -1;
            memset(players, 0, sizeof(players));
    
            pre_game();
            int round = 0;
            while(!check_game_end()) {
                night_phase();          // 黑夜行动
                announce_night_result();// 公布夜晚结果
                if(check_game_end()) break;
    
                system("cls");
                print_ui();
    
                // 12人局第一天选举警长
                if(round == 0 && player_count == 12 && police_seat == -1) {
                    elect_police();
                    system("cls");
                    print_ui();
                }
    
                vote_phase();           // 白天投票
                if(check_game_end()) break;
    
                day++;
                round++;
                system("cls");
                print_ui();
            }
            game_over();
            system("pause");
            system("cls");
        }
        return 0;
    }
    
    

    打开项目 → 工具 → 编译选项 → 切换到 “连接器” 标签页 → 在 “连接器命令行” 输入框中:-static-libgcc -lwinmm -std=c++11 起风了:

    #include <iostream>
    #include <Windows.h>
    #pragma comment(lib,"winmm.lib")
    using namespace std;
    enum Scale
    {
        Rest = 0, C8 = 108, B7 = 107, A7s = 106, A7 = 105, G7s = 104, G7 = 103, F7s = 102, F7 = 101, E7 = 100,
        D7s = 99, D7 = 98, C7s = 97, C7 = 96, B6 = 95, A6s = 94, A6 = 93, G6s = 92, G6 = 91, F6s = 90, F6 = 89,
        E6 = 88, D6s = 87, D6 = 86, C6s = 85, C6 = 84, B5 = 83, A5s = 82, A5 = 81, G5s = 80, G5 = 79, F5s = 78,
        F5 = 77, E5 = 76, D5s = 75, D5 = 74, C5s = 73, C5 = 72, B4 = 71, A4s = 70, A4 = 69, G4s = 68, G4 = 67,
        F4s = 66, F4 = 65, E4 = 64, D4s = 63, D4 = 62, C4s = 61, C4 = 60, B3 = 59, A3s = 58, A3 = 57, G3s = 56,
        G3 = 55, F3s = 54, F3 = 53, E3 = 52, D3s = 51, D3 = 50, C3s = 49, C3 = 48, B2 = 47, A2s = 46, A2 = 45,
        G2s = 44, G2 = 43, F2s = 42, F2 = 41, E2 = 40, D2s = 39, D2 = 38, C2s = 37, C2 = 36, B1 = 35, A1s = 34,
        A1 = 33, G1s = 32, G1 = 31, F1s = 30, F1 = 29, E1 = 28, D1s = 27, D1 = 26, C1s = 25, C1 = 24, B0 = 23,
        A0s = 22, A0 = 21
    };
    enum Voice
    {
        X1 = C2, X2 = D2, X3 = E2, X4 = F2, X5 = G2, X6 = A2, X7 = B2,
        L1 = C3, L2 = D3, L3 = E3, L4 = F3, L5 = G3, L6 = A3, L7 = B3,
        M1 = C4, M2 = D4, M3 = E4, M4 = F4, M5 = G4, M6 = A4, M7 = B4,
        H1 = C5, H2 = D5, H3 = E5, H4 = F5, H5 = G5, H6 = A5, H7 = B5,
        LOW_SPEED = 500, MIDDLE_SPEED = 400, HIGH_SPEED = 300,
        _ = 0XFF
    };
    void Wind()
    {
        HMIDIOUT handle;
        midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
        int volume = 0x7f;
        int voice = 0x0;
        int sleep = 350;
        int wind[] =
        {
             400,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,
             0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,
             0,M6,M3,M2,L6,M3,L6,M2,M3,L6,_,_,_,
             M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M1,300,M2,700,0,M1,M2,M3,M2,M1,300,L5,_,
             M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,M2,_,_,_,
             M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,L6,_,
             0,M3,M2,M1,M2,300,M1,_,0,M3,M2,M1,M2,300,M1,700,0,L5,M3,M2,M1,M2,300,M1,_,_,_,
             M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,M5,M6,_,M5,M6,M5,300,M6,0,M5,M2,300,_,0,M5,700,300,M3,_,_,_,
             M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,H3,H3,300,_,M5,M6,0,H3,H3,300,_,0,M5,700,300,M6,_,_,_,_,_,
             H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
             H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
             H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
             0,M6,300,H3,700,H2,0,H1,M6,700,300,H3,H2,700,300,0,H1,M6,300,700,H1,H1,_,_,
             0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,
             0,M6,M3,M2,L6,M3,L6,M2,M3,L6,_,_,_,
             M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M1,300,M2,700,0,M1,M2,M3,M2,M1,300,L5,_,
             M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,M2,_,_,_,
             M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,L6,_,
             0,M3,M2,M1,M2,300,M1,_,0,M3,M2,M1,M2,300,M1,700,0,L5,M3,M2,M1,M2,300,M1,_,_,_,
             M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,M5,M6,_,M5,M6,M5,300,M6,0,M5,M2,300,_,0,M5,700,300,M3,_,_,_,
             M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,H3,H3,300,_,M5,M6,0,H3,H3,300,_,0,M5,700,300,M6,_,_,_,_,_,
             H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
             H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
             H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
             H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
             H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
             H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
             H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
             H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
             H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
             0,M6,300,H3,700,H2,0,H1,M6,700,300,H3,H2,700,300,0,H1,M6,300,700,H1,H1,_,_,_,_,_,_,_,
        };
    
        int len = sizeof(wind) / sizeof(wind[0]);
        for (int i = 0; i < len; i++) {
            int val = wind[i];
            if (val == 0) { sleep = 175; continue; }
            if (val == 700) { Sleep(175); continue; }
            if (val == 300) { sleep = 350; continue; }
            if (val == _) {
                Sleep(350);
                continue;
            }
            voice = (volume << 16) + ((val) << 8) + 0x90;
            midiOutShortMsg(handle, voice);
            cout << voice << endl;
            Sleep(sleep);
        }
        midiOutClose(handle);
    }
    int main()
    {
        Wind();
        return 0;
    }
    
    
    

    茉莉花:

    #include <iostream>
    #include <Windows.h>
    #include <vector>
    #include <stdexcept>
    #include <algorithm>  // 用于数值范围限制
    #pragma comment(lib, "winmm.lib")
    using namespace std;
    
    // 音符枚举(MIDI音高值,H=高八度 M=中八度 L=低八度 LL=倍低八度)
    enum Note {
        Rest = 0,          // 休止符
        // 高八度
        H1 = 73, H2 = 76, H3 = 77, H4 = 79, H5 = 81,
        // 中八度(基准)
        M1 = 60, M2 = 62, M3 = 64, M4 = 65, M5 = 67, M6 = 69, M7 = 71,
        // 低八度
        L1 = 48, L2 = 50, L3 = 52, L4 = 53, L5 = 55, L6 = 57, L7 = 59,
        // 倍低八度
        LL1 = 36, LL2 = 38, LL3 = 40, LL4 = 41, LL5 = 43, LL6 = 45, LL7 = 47
    };
    
    // 播放参数枚举(时长/速度,单位:毫秒)
    enum PlayParam {
        SpeedSlow = 500,    // 慢速
        SpeedNormal = 350,  // 正常速度
        SpeedFast = 250,    // 快速
        RestShort = 175,    // 短休止(半拍)
        RestLong = 700,     // 长休止(两拍)
        EndMarker = 0xFF    // 乐曲结束标记
    };
    
    // 音乐演奏类(封装MIDI操作,保证资源安全)
    class MusicPlayer {
    private:
        HMIDIOUT midiHandle = NULL;  // MIDI输出句柄
        int currentVolume = 100;     // 音量(0-127)
        int currentSpeed = SpeedNormal;  // 当前速度(毫秒/拍)
    
        // 初始化MIDI设备(私有方法,仅构造函数调用)
        void initMidi() {
            MMRESULT result = midiOutOpen(&midiHandle, MIDI_MAPPER, 0, 0, CALLBACK_NULL);
            if (result != MMSYSERR_NOERROR) {
                throw runtime_error("MIDI设备初始化失败!错误码:" + to_string(result));
            }
            // 设置乐器:0xC0(程序变更) + 通道0 + 乐器编号0(钢琴)
            midiOutShortMsg(midiHandle, 0xC00000);
            // 设置初始音量(控制器7,通道0)
            setVolume(currentVolume);
        }
    
        // 关闭MIDI设备(保证资源释放)
        void closeMidi() {
            if (midiHandle) {
                midiOutReset(midiHandle);  // 停止所有播放中的音符
                midiOutClose(midiHandle);
                midiHandle = NULL;
            }
        }
    
    public:
        // 构造函数(初始化MIDI,设置默认音量和速度)
        MusicPlayer(int volume = 100, int speed = SpeedNormal) {
            currentVolume = clamp(volume, 0, 127);  // 限制音量范围
            currentSpeed = max(speed, 50);          // 速度不低于50ms
            initMidi();
        }
    
        // 析构函数(自动释放MIDI资源)
        ~MusicPlayer() {
            closeMidi();
        }
    
        // 禁用拷贝构造和赋值(避免MIDI句柄重复释放)
        MusicPlayer(const MusicPlayer&) = delete;
        MusicPlayer& operator=(const MusicPlayer&) = delete;
    
        // 设置音量(0-127,超出范围自动修正)
        void setVolume(int volume) {
            currentVolume = clamp(volume, 0, 127);
            // MIDI控制器消息:0xB0(控制器) + 控制器7(音量) + 音量值 + 通道0
            DWORD volMsg = (currentVolume << 8) | 0xB007;
            midiOutShortMsg(midiHandle, volMsg);
        }
    
        // 设置播放速度(最小50ms/拍)
        void setSpeed(int speed) {
            currentSpeed = max(speed, 50);
        }
    
        // 播放单个音符(内部调用,处理音符开关)
        void playNote(Note note, int duration) {
            if (note == Rest) {  // 休止符直接等待
                Sleep(duration);
                return;
            }
    
            // 音符开启消息:0x90(音符开) + 音高 + 音量 + 通道0
            DWORD noteOn = (currentVolume << 16) | (static_cast<int>(note) << 8) | 0x90;
            midiOutShortMsg(midiHandle, noteOn);
    
            // 保持音符时长
            Sleep(duration);
    
            // 音符关闭消息:0x80(音符关) + 音高 + 0(音量) + 通道0
            DWORD noteOff = (0 << 16) | (static_cast<int>(note) << 8) | 0x80;
            midiOutShortMsg(midiHandle, noteOff);
        }
    
        // 播放完整乐曲(解析音符序列)
        void playMusic(const vector<int>& musicData) {
            for (int data : musicData) {
                switch (data) {
                    case EndMarker:      // 结束标记,终止播放
                        return;
                    case RestShort:      // 短休止
                        playNote(Rest, RestShort);
                        break;
                    case RestLong:       // 长休止
                        playNote(Rest, RestLong);
                        break;
                    case SpeedSlow:      // 设置慢速
                        setSpeed(SpeedSlow);
                        break;
                    case SpeedNormal:    // 设置正常速度
                        setSpeed(SpeedNormal);
                        break;
                    case SpeedFast:      // 设置快速
                        setSpeed(SpeedFast);
                        break;
                    default:             // 普通音符
                        if (data >= LL1 && data <= H5) {  // 校验音符范围
                            playNote(static_cast<Note>(data), currentSpeed);
                        } else {
                            cerr << "警告:无效音符值 " << data << ",已跳过" << endl;
                        }
                        break;
                }
            }
        }
    };
    vector<int> jasmineMusic;
    void initJasmineMusic() {
        // 第一段:好一朵美丽的茉莉花
        jasmineMusic = {
            M3, M5, H1, H1,     // 好 一 朵 美
            H1, H2, H1, M6,     // 丽 的 茉 莉
            M5, M5, M6, M5,     // 花 好 一 朵
            M3, M5, M6, M3,     // 美 丽 的 茉 莉
            RestShort,           // 短休止
            // 第二段:芬芳美丽满枝桠
            M2, M3, M5, M5,     // 花 芬 芳 美
            M3, M2, M1, M1,     // 丽 满 枝 桠
            M2, M3, M2, M3,     // 又 香 又 白
            M5, M3, M1, M1,     // 人 人 夸
            RestLong,            // 长休止
            EndMarker            // 乐曲结束
        };
    }
    
    int main() {
        initJasmineMusic();
        try {
            cout << "开始播放《茉莉花》..." << endl;
            MusicPlayer player(100, SpeedNormal);
            player.playMusic(jasmineMusic);
            cout << "播放完成!" << endl;
        } catch (const exception& e) {
            cerr << "播放失败:" << e.what() << endl;
            return 1;
        }
    
        return 0;
    }
    
    

    我的世界 代表作: 长达5000000の小说 神秘小网页:

    https://www.bilibili.com/video/BV1bsLBzyESz?spm_id_from=333.788.videopod.sections
    

    小照片:

    什么?你居然看到这了!你肯定用了什么骚操作 话说我可用了0.006个世纪啊

  • 通过的题目

  • 最近活动

题目标签

一本通编程启蒙
35
模拟算法
3
for循环双重嵌套
2
多重循环
2
1
1
2022
1
2024
1
其他
1
排序
1
数论
1
循环
1
函数
1
bfs
1
图结构
1
最短路
1
归并排序
1
蓝桥杯省赛
1
蓝桥杯
1
省赛
1