#include<bits/stdc++.h> 
#include<windows.h> 
#include<conio.h> 
using namespace std;
const int game_day=0, game_task=1, game_meeting=2; // 游戏阶段:日常/任务/紧急会议
int round_num=0, current_phase=game_day;
int player_count, my_id;
HWND hwnd=GetForegroundWindow();
const int blue=0,yellow=1,red=2,green=3,purple=4,white=5,cyan=6,orange=7;
const int crewmate=0, impostor=1, engineer=2, medic=3, detective=4;
const int alive=0, dead=1, ejected=2; // 状态:存活/死亡/被投票驱逐
int impostor_count=0;          // 内鬼数量
int engineer_id=-1, medic_id=-1, detective_id=-1;
int impostor_ids[4]={-1,-1,-1,-1}; // 内鬼ID数组
int ejected_player=-1;          // 被驱逐的玩家
int killed_player=-1;           // 被杀死的玩家
int shielded_player=-1;         // 被医生保护的玩家
int repaired_task=-1;           // 工程师修复的任务
void color(int c){
    switch(c){
        case red:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);break;
        case green:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);break;
        case yellow:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN);break;
        case blue:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);break;
        case white:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN | FOREGROUND_BLUE);break;
        case purple:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_BLUE);break;
        case cyan:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);break;
        case orange:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN/2);break;
    }
}
void gotoxy(int x,int y){
    COORD position;
    position.X=x;
    position.Y=y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}
void init_window(){
    system("mode con lines=60 cols=188"); 
    ShowWindow(hwnd,SW_MAXIMIZE);
    DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND);
    DrawMenuBar(GetConsoleWindow());
}
class Player{
public:
    int role;          // 身份
    int status;        // 存活状态
    int task_progress; // 任务进度(船员)
    int kill_count;    // 击杀数(内鬼)
    bool is_visible;   // 身份是否对自己可见
    
    Player(){
        role=-1;
        status=alive;
        task_progress=0;
        kill_count=0;
        is_visible=false;
    }
    
    int get_status(){
        return status;
    }
};
Player players[15]; // 最多15人游戏
bool is_include(int arr[], int val, int len){
    for(int i=0;i<len;i++){
        if(arr[i]==val) return true;
    }
    return false;
}
void init_players(){
    my_id=rand()%player_count;
    if(player_count<=6) impostor_count=1;
    else if(player_count<=10) impostor_count=2;
    else if(player_count<=15) impostor_count=3;
    for(int i=0;i<player_count;i++){
        players[i].status=alive;
        players[i].task_progress=0;
        players[i].kill_count=0;
        players[i].is_visible=false;
        players[i].role=-1;
    }
    for(int i=0;i<impostor_count;i++){
        int p=rand()%player_count;
        if(!is_include(impostor_ids, p, 4)){
            impostor_ids[i]=p;
            players[p].role=impostor;
        }else{
            i--;
        }
        Sleep(rand()%80+100);
    }
    do{
        engineer_id=rand()%player_count;
    }while(players[engineer_id].role!=-1);
    players[engineer_id].role=engineer;
    if(player_count>=8){
        do{
            medic_id=rand()%player_count;
        }while(players[medic_id].role!=-1);
        players[medic_id].role=medic;
    }
    if(player_count>=10){
        do{
            detective_id=rand()%player_count;
        }while(players[detective_id].role!=-1);
        players[detective_id].role=detective;
    }
    // 剩余玩家为普通船员
    for(int i=0;i<player_count;i++){
        if(players[i].role==-1){
            players[i].role=crewmate;
        }
    }
    players[my_id].is_visible=true;
    if(players[my_id].role==impostor){
        for(int i=0;i<impostor_count;i++){
            players[impostor_ids[i]].is_visible=true;
        }
    }
}
void print_game(){
    gotoxy(0,0);
    cout<<"太空杀 | 作者:爱谁谁";
    gotoxy(90,0);
    if(current_phase==game_meeting) color(red);
    else if(current_phase==game_task) color(cyan);
    else color(blue);
    printf("第%d回合 | ",round_num);
    if(current_phase==game_day) cout<<"日常阶段";
    else if(current_phase==game_task) cout<<"任务阶段";
    else cout<<"紧急会议";
    gotoxy(0,3);
    color(blue);
    cout<<" 我的编号:"<<my_id+1;
    for(int i=0;i<player_count;i++){
        gotoxy(i*8+1,4);
        color(blue);
        cout<<i+1<<"号"; 
        
        gotoxy(i*8+1,5);
        if(players[i].get_status()==dead){
            color(red);
            cout<<"已死亡";
        }else if(players[i].get_status()==ejected){
            color(yellow);
            cout<<"被驱逐";
        }else{
            color(green);
            cout<<"存活中";
        }
        gotoxy(i*8+1,6);
        color(blue);
        if(players[i].is_visible){
            switch(players[i].role){
                case crewmate: cout<<"船员";break;
                case impostor: cout<<"内鬼";break;
                case engineer: cout<<"工程师";break;
                case medic: cout<<"医生";break;
                case detective: cout<<"侦探";break;
            }
        }else{
            cout<<"未知";
        }
        if(players[i].role==crewmate && players[i].get_status()==alive){
            gotoxy(i*8+1,7);
            color(white);
            cout<<"任务:"<<players[i].task_progress<<"%";
        }
    }
    gotoxy(0,10);
    color(white);
    cout<<"________________________";
}
int check_game_end(){
    int alive_crew=0, alive_impostor=0;
    int completed_tasks=0;
    int total_crew=player_count-impostor_count;
    for(int i=0;i<player_count;i++){
        if(players[i].get_status()==alive){
            if(players[i].role==impostor) alive_impostor++;
            else alive_crew++;
        }
        if(players[i].role!=impostor && players[i].task_progress>=100){
            completed_tasks++;
        }
    }
    if(alive_crew<=alive_impostor && alive_impostor>0) return 1;
    if(alive_impostor==0) return 2;
    if(completed_tasks>=total_crew*0.8) return 2;
    return 0;
}
void game_init(){
    srand(time(NULL));
    init_window();
    color(green);
    cout<<"欢迎来到太空杀游戏!\n";
    cout<<"规则:内鬼需要杀死船员,船员需要完成任务或找出内鬼\n";
    cout<<"特殊身份:工程师可修复设施,医生可保护船员,侦探可查看线索\n";
    cout<<"______________________\n";
    cout<<"请输入玩家人数(4-15人):";
    cin>>player_count;
    while(player_count<4||player_count>15){
        cout<<"请重新输入(4-15)!\n"; 
        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_id+1<<endl
        <<"我的身份:";
    switch(players[my_id].role){
        case crewmate: cout<<"普通船员\n";break;
        case impostor: cout<<"内鬼\n";break;
        case engineer: cout<<"工程师\n";break;
        case medic: cout<<"医生\n";break;
        case detective: cout<<"侦探\n";break;
    }
    round_num=1;
    current_phase=game_day;
    system("pause");
    system("cls");
    cout<<"游戏加载中.";
    int load_time=rand()%3+2;
    for(int i=0;i<load_time;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";
    }
    print_game();
}
int impostor_action(){
    int target=-1;
    color(red);
    cout<<"内鬼~请行动~~\n";
    Sleep(1500);
    cout<<"你要袭击谁?\n";
    if(players[my_id].role==impostor && players[my_id].get_status()==alive){
        cin>>target;
        while(!(target>=1&&target<=player_count&&players[target-1].get_status()==alive&&players[target-1].role!=impostor)){
            cout<<"无效目标!重新输入:\n";
            cin>>target;
        }
        target--;
        cout<<"你选择袭击"<<target+1<<"号船员!\n";
        Sleep(2000);
    }else{
        while(target==-1 || players[target].get_status()!=alive || players[target].role==impostor){
            target=rand()%player_count;
        }
        Sleep(2000);
    }
    cout<<"内鬼行动完成!\n\n";
    return target;
}
int engineer_action(){
    color(cyan);
    cout<<"工程师~请行动~~\n";
    Sleep(1500);
    int repair=-1;
    if(players[my_id].role==engineer && players[my_id].get_status()==alive){
        cout<<"发现设施损坏,是否修复?(1=修复/2=不修复)\n";
        int choice;
        cin>>choice;
        if(choice==1){
            repair=1;
            cout<<"你修复了损坏的设施!\n";
        }else{
            repair=0;
            cout<<"你选择不修复设施!\n";
        }
        Sleep(1500);
    }else{
        repair=rand()%2;
    }
    cout<<"工程师行动完成!\n\n";
    return repair;
}
int medic_action(){
    color(green);
    cout<<"医生~请行动~~\n";
    Sleep(1500);
    int protect=-1;
    if(players[my_id].role==medic && players[my_id].get_status()==alive){
        cout<<"选择一名船员进行保护:\n";
        cin>>protect;
        while(!(protect>=1&&protect<=player_count&&players[protect-1].get_status()==alive)){
            cout<<"无效目标!重新输入:\n";
            cin>>protect;
        }
        protect--;
        cout<<"你保护了"<<protect+1<<"号船员!\n";
        Sleep(1500);
    }else{
        while(protect==-1 || players[protect].get_status()!=alive){
            protect=rand()%player_count;
        }
    }
    cout<<"医生行动完成!\n\n";
    return protect;
}
void detective_action(){
    color(purple);
    cout<<"侦探~请行动~~\n";
    Sleep(1500);
    if(players[my_id].role==detective && players[my_id].get_status()==alive){
        cout<<"你发现了可疑线索,选择调查哪位玩家?\n";
        int suspect;
        cin>>suspect;
        while(!(suspect>=1&&suspect<=player_count)){
            cout<<"无效目标!重新输入:\n";
            cin>>suspect;
        }
        suspect--
        cout<<"调查结果:";
        if(players[suspect].role==impostor){
            color(red);
            cout<<suspect+1<<"号行为异常,可能是内鬼!\n";
            players[suspect].is_visible=true;
        }else{
            color(green);
            cout<<suspect+1<<"号行为正常,是船员!\n";
        }
        Sleep(2000);
    }
    cout<<"侦探行动完成!\n\n";
}
void crewmate_tasks(){
    color(white);
    cout<<"船员开始执行任务!\n";
    Sleep(1000);
    for(int i=0;i<player_count;i++){
        if(players[i].role!=impostor && players[i].get_status()==alive){
            if(i==my_id){
                cout<<"\n你需要完成任务:";
                int task_choice;
                cout<<"1=维修电路 2=清理管道 3=检查引擎\n";
                cin>>task_choice;
                players[i].task_progress+=rand()%30+10;
                if(players[i].task_progress>100) players[i].task_progress=100;
                cout<<"任务完成!当前进度:"<<players[i].task_progress<<"%\n";
            }else{
                // AI船员
                players[i].task_progress+=rand()%20+5;
                if(players[i].task_progress>100) players[i].task_progress=100;
            }
            Sleep(500);
        }
    }
    cout<<"\n任务阶段结束!\n";
    Sleep(1500);
}
int emergency_meeting(){
    system("cls");
    print_game();
    color(red);
    gotoxy(0,7);
    cout<<"________________________\n";
    cout<<"紧急会议!全体船员集合!\n";
    Sleep(2000);
    int votes[15]={0};
    memset(votes,0,sizeof(votes));
    color(white);
    cout<<"开始投票!选择你怀疑的内鬼:\n";
    Sleep(1000);
    VOTE_AGAIN:
    for(int i=0;i<player_count;i++){
        if(players[i].get_status()==alive){
            if(i==my_id){
                cout<<"\n你的投票:";
                int vote;
                cin>>vote;
                while(!(vote>=1&&vote<=player_count)){
                    cout<<"无效投票!重新输入:\n";
                    cin>>vote;
                }
                vote--;
                votes[vote]++;
                cout<<"你投票给了"<<vote+1<<"号!\n";
            }else{
                // AI投票
                int ai_vote=rand()%player_count;
                votes[ai_vote]++;
                cout<<i+1<<"号投票给了"<<ai_vote+1<<"号!\n";
            }
            Sleep(800);
        }
    }
	s=-1, eject_id=-1, tie_count=0;
    int tie_ids[15]={-1};
    for(int i=0;i<player_count;i++){
        if(votes[i]>max_votes){
            max_votes=votes[i];
            eject_id=i;
            tie_count=0;
            tie_ids[0]=i;
        }else if(votes[i]==max_votes && max_votes>0){
            tie_count++;
            tie_ids[tie_count]=i;
        }
    }
    if(tie_count>0){
        color(yellow);
        cout<<"\n投票平票!重新投票:\n";
        memset(votes,0,sizeof(votes));
        Sleep(1500);
        goto VOTE_AGAIN;
    }
    if(max_votes==0){
        color(blue);
        cout<<"\n无人获得票数,会议结束!\n";
        Sleep(2000);
        return -1;
    }
    color(red);
    cout<<"\n"<<eject_id+1<<"号获得最高票数!\n";
    Sleep(1500);
    cout<<eject_id+1<<"号被驱逐出飞船!\n";
    players[eject_id].status=ejected;
    color(white);
    cout<<"真实身份:";
    switch(players[eject_id].role){
        case crewmate: color(green);cout<<"船员\n";break;
        case impostor: color(red);cout<<"内鬼\n";break;
        case engineer: color(cyan);cout<<"工程师\n";break;
        case medic: color(green);cout<<"医生\n";break;
        case detective: color(purple);cout<<"侦探\n";break;
    }
    Sleep(3000);
    return eject_id;
}
void process_kill(){
    killed_player=impostor_action();
    if(killed_player==shielded_player){
        color(green);
        cout<<killed_player+1<<"号被医生保护,袭击失败!\n";
        killed_player=-1;
    }else if(killed_player!=-1){
        color(red);
        cout<<killed_player+1<<"号被内鬼袭击!已死亡!\n";
        players[killed_player].status=dead;
    }
    Sleep(2000);
}
void game_round(){
    current_phase=game_day;
    system("cls");
    print_game();
    color(blue);
    gotoxy(0,7);
    cout<<"________________________\n";
    cout<<"日常阶段 | 船员自由活动中...\n";
    Sleep(2000);
    shielded_player=-1;
    killed_player=-1;
    current_phase=game_task;
    system("cls");
    print_game();
    color(cyan);
    gotoxy(0,7);
    cout<<"________________________\n";
    cout<<"任务阶段开始!\n";
    if(player_count>=12) repaired_task=engineer_action(); // 工程师
    if(player_count>=8) shielded_player=medic_action();   // 医生
    if(player_count>=10) detective_action();              // 侦探
    process_kill();
    if(killed_player==-1){ // 无人死亡则进行任务
        crewmate_tasks();
}
    if(killed_player!=-1 || rand()%3==0){
        current_phase=game_meeting;
        ejected_player=emergency_meeting();
    }
    
    round_num++;
}
void game_over(){
    system("cls");
    color(white);
    
    int result=check_game_end();
    if(result==1){
        color(red);
        cout<<"========== 游戏结束 ==========\n";
        cout<<"          内鬼胜利!\n";
        cout<<"==============================\n\n";
    }else if(result==2){
        color(green);
        cout<<"========== 游戏结束 ==========\n";
        cout<<"          船员胜利!\n";
        cout<<"==============================\n\n";
    }
    color(white);
    cout<<"最终统计:\n";
    for(int i=0;i<player_count;i++){
        cout<<i+1<<"号: ";
        switch(players[i].role){
            case crewmate: color(green);cout<<"船员";break;
            case impostor: color(red);cout<<"内鬼";break;
            case engineer: color(cyan);cout<<"工程师";break;
            case medic: color(green);cout<<"医生";break;
            case detective: color(purple);cout<<"侦探";break;
        }
        
        color(white);
        cout<<" | 状态:";
        if(players[i].status==alive) cout<<"存活";
        else if(players[i].status==dead) cout<<"被击杀";
        else cout<<"被驱逐";
        
        if(players[i].role==crewmate){
            cout<<" | 任务进度:"<<players[i].task_progress<<"%";
        }else if(players[i].role==impostor){
            cout<<" | 击杀数:"<<players[i].kill_count;
        }
        cout<<endl;
    }
}
int main(){
    game_init();
    while(!check_game_end()){
        game_round();
        system("cls");
        print_game();
        if(check_game_end()) break;
        color(blue);
        cout<<"\n\n按任意键继续下一轮...";
        _getch();
    }
    game_over();
    system("pause");
    return 0;
}

1 条评论

  • @ 2025-12-9 17:31:53
    #include<bits/stdc++.h> 
    #include<windows.h> 
    #include<conio.h> 
    using namespace std;
    
    // 游戏阶段:日常/任务/紧急会议
    const int game_day=0, game_task=1, game_meeting=2; 
    int round_num=0, current_phase=game_day;
    int player_count, my_id;
    HWND hwnd=GetForegroundWindow();
    
    // 颜色定义
    const int blue=0,yellow=1,red=2,green=3,purple=4,white=5,cyan=6,orange=7;
    // 身份定义
    const int crewmate=0, impostor=1, engineer=2, medic=3, detective=4;
    // 状态定义:存活/死亡/被投票驱逐
    const int alive=0, dead=1, ejected=2; 
    
    // 游戏核心变量
    int impostor_count=0;          // 内鬼数量
    int engineer_id=-1, medic_id=-1, detective_id=-1;
    int impostor_ids[4]={-1,-1,-1,-1}; // 内鬼ID数组
    int ejected_player=-1;          // 被驱逐的玩家
    int killed_player=-1;           // 被杀死的玩家
    int shielded_player=-1;         // 被医生保护的玩家
    int repaired_task=-1;           // 工程师修复的任务
    
    // 设置控制台文字颜色
    void color(int c){
        switch(c){
            case red:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);break;
            case green:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);break;
            case yellow:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN);break;
            case blue:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);break;
            case white:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN | FOREGROUND_BLUE);break;
            case purple:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_BLUE);break;
            case cyan:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);break;
            case orange:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN/2);break;
        }
    }
    
    // 设置控制台光标位置
    void gotoxy(int x,int y){
        COORD position;
        position.X=x;
        position.Y=y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
    }
    
    // 初始化游戏窗口
    void init_window(){
        system("mode con lines=60 cols=188"); 
        ShowWindow(hwnd,SW_MAXIMIZE);
        DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND);
        DrawMenuBar(GetConsoleWindow());
    }
    
    // 玩家类定义
    class Player{
    public:
        int role;          // 身份
        int status;        // 存活状态
        int task_progress; // 任务进度(船员)
        int kill_count;    // 击杀数(内鬼)
        bool is_visible;   // 身份是否对自己可见
        
        Player(){
            role=-1;
            status=alive;
            task_progress=0;
            kill_count=0;
            is_visible=false;
        }
        
        int get_status(){
            return status;
        }
    };
    
    Player players[15]; // 最多15人游戏
    
    // 检查数组是否包含指定值
    bool is_include(int arr[], int val, int len){
        for(int i=0;i<len;i++){
            if(arr[i]==val) return true;
        }
        return false;
    }
    
    // 初始化玩家身份
    void init_players(){
        my_id=rand()%player_count;
        // 设置内鬼数量
        if(player_count<=6) impostor_count=1;
        else if(player_count<=10) impostor_count=2;
        else if(player_count<=15) impostor_count=3;
        
        // 初始化玩家状态
        for(int i=0;i<player_count;i++){
            players[i].status=alive;
            players[i].task_progress=0;
            players[i].kill_count=0;
            players[i].is_visible=false;
            players[i].role=-1;
        }
        
        // 分配内鬼
        int wolf_idx=0;
        while(wolf_idx < impostor_count){
            int p=rand()%player_count;
            if(!is_include(impostor_ids, p, 4)){
                impostor_ids[wolf_idx]=p;
                players[p].role=impostor;
                wolf_idx++;
            }
            Sleep(rand()%80+100);
        }
        
        // 分配工程师
        do{
            engineer_id=rand()%player_count;
        }while(players[engineer_id].role!=-1);
        players[engineer_id].role=engineer;
        
        // 分配医生(8人及以上)
        if(player_count>=8){
            do{
                medic_id=rand()%player_count;
            }while(players[medic_id].role!=-1);
            players[medic_id].role=medic;
        }
        
        // 分配侦探(10人及以上)
        if(player_count>=10){
            do{
                detective_id=rand()%player_count;
            }while(players[detective_id].role!=-1);
            players[detective_id].role=detective;
        }
        
        // 剩余玩家为普通船员
        for(int i=0;i<player_count;i++){
            if(players[i].role==-1){
                players[i].role=crewmate;
            }
        }
        
        // 标记自己已知的身份
        players[my_id].is_visible=true;
        if(players[my_id].role==impostor){
            for(int i=0;i<impostor_count;i++){
                players[impostor_ids[i]].is_visible=true;
            }
        }
    }
    
    // 打印游戏界面
    void print_game(){
        system("cls");
        gotoxy(0,0);
        cout<<"太空杀 | 作者:爱谁谁";
        gotoxy(90,0);
        
        // 设置阶段颜色
        if(current_phase==game_meeting) color(red);
        else if(current_phase==game_task) color(cyan);
        else color(blue);
        
        printf("第%d回合 | ",round_num);
        if(current_phase==game_day) cout<<"日常阶段";
        else if(current_phase==game_task) cout<<"任务阶段";
        else cout<<"紧急会议";
        
        gotoxy(0,3);
        color(blue);
        cout<<" 我的编号:"<<my_id+1;
        
        // 打印玩家信息
        for(int i=0;i<player_count;i++){
            gotoxy(i*8+1,4);
            color(blue);
            cout<<i+1<<"号"; 
            
            gotoxy(i*8+1,5);
            if(players[i].get_status()==dead){
                color(red);
                cout<<"已死亡";
            }else if(players[i].get_status()==ejected){
                color(yellow);
                cout<<"被驱逐";
            }else{
                color(green);
                cout<<"存活中";
            }
            
            gotoxy(i*8+1,6);
            color(blue);
            if(players[i].is_visible){
                switch(players[i].role){
                    case crewmate: cout<<"船员";break;
                    case impostor: cout<<"内鬼";break;
                    case engineer: cout<<"工程师";break;
                    case medic: cout<<"医生";break;
                    case detective: cout<<"侦探";break;
                }
            }else{
                cout<<"未知";
            }
            
            // 打印船员任务进度
            if(players[i].role==crewmate && players[i].get_status()==alive){
                gotoxy(i*8+1,7);
                color(white);
                cout<<"任务:"<<players[i].task_progress<<"%";
            }
        }
        
        gotoxy(0,10);
        color(white);
        cout<<"________________________";
    }
    
    // 检查游戏是否结束
    int check_game_end(){
        int alive_crew=0, alive_impostor=0;
        int completed_tasks=0;
        int total_crew=player_count-impostor_count;
        
        // 统计存活人数和完成任务数
        for(int i=0;i<player_count;i++){
            if(players[i].get_status()==alive){
                if(players[i].role==impostor) alive_impostor++;
                else alive_crew++;
            }
            if(players[i].role!=impostor && players[i].task_progress>=100){
                completed_tasks++;
            }
        }
        
        // 内鬼胜利条件:存活船员数 ≤ 内鬼数
        if(alive_crew<=alive_impostor && alive_impostor>0) return 1;
        // 船员胜利条件:内鬼全灭 或 80%船员完成任务
        if(alive_impostor==0 || completed_tasks>=total_crew*0.8) return 2;
        // 游戏继续
        return 0;
    }
    
    // 游戏初始化
    void game_init(){
        srand(time(NULL));
        init_window();
        
        color(green);
        cout<<"欢迎来到太空杀游戏!\n";
        cout<<"规则:内鬼需要杀死船员,船员需要完成任务或找出内鬼\n";
        cout<<"特殊身份:工程师可修复设施,医生可保护船员,侦探可查看线索\n";
        cout<<"______________________\n";
        cout<<"请输入玩家人数(4-15人):";
        
        // 输入玩家人数
        cin>>player_count;
        while(player_count<4||player_count>15){
            cout<<"请重新输入(4-15)!\n"; 
            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_id+1<<endl
            <<"我的身份:";
        switch(players[my_id].role){
            case crewmate: cout<<"普通船员\n";break;
            case impostor: cout<<"内鬼\n";break;
            case engineer: cout<<"工程师\n";break;
            case medic: cout<<"医生\n";break;
            case detective: cout<<"侦探\n";break;
        }
        
        // 初始化游戏参数
        round_num=1;
        current_phase=game_day;
        
        system("pause");
        system("cls");
        cout<<"游戏加载中.";
        int load_time=rand()%3+2;
        for(int i=0;i<load_time;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";
        }
        
        print_game();
    }
    
    // 内鬼行动(选择击杀目标)
    int impostor_action(){
        int target=-1;
        color(red);
        cout<<"内鬼~请行动~~\n";
        Sleep(1500);
        cout<<"你要袭击谁?\n";
        
        // 玩家是内鬼且存活
        if(players[my_id].role==impostor && players[my_id].get_status()==alive){
            cin>>target;
            while(!(target>=1&&target<=player_count&&players[target-1].get_status()==alive&&players[target-1].role!=impostor)){
                cout<<"无效目标!重新输入:\n";
                cin>>target;
            }
            target--;
            cout<<"你选择袭击"<<target+1<<"号船员!\n";
            Sleep(2000);
        }else{
            // AI选择目标
            while(target==-1 || players[target].get_status()!=alive || players[target].role==impostor){
                target=rand()%player_count;
            }
            Sleep(2000);
        }
        
        cout<<"内鬼行动完成!\n\n";
        return target;
    }
    
    // 工程师行动(修复设施)
    int engineer_action(){
        color(cyan);
        cout<<"工程师~请行动~~\n";
        Sleep(1500);
        int repair=-1;
        
        // 玩家是工程师且存活
        if(players[my_id].role==engineer && players[my_id].get_status()==alive){
            cout<<"发现设施损坏,是否修复?(1=修复/2=不修复)\n";
            int choice;
            cin>>choice;
            if(choice==1){
                repair=1;
                cout<<"你修复了损坏的设施!\n";
            }else{
                repair=0;
                cout<<"你选择不修复设施!\n";
            }
            Sleep(1500);
        }else{
            // AI随机选择
            repair=rand()%2;
        }
        
        cout<<"工程师行动完成!\n\n";
        return repair;
    }
    
    // 医生行动(保护船员)
    int medic_action(){
        color(green);
        cout<<"医生~请行动~~\n";
        Sleep(1500);
        int protect=-1;
        
        // 玩家是医生且存活
        if(players[my_id].role==medic && players[my_id].get_status()==alive){
            cout<<"选择一名船员进行保护:\n";
            cin>>protect;
            while(!(protect>=1&&protect<=player_count&&players[protect-1].get_status()==alive)){
                cout<<"无效目标!重新输入:\n";
                cin>>protect;
            }
            protect--;
            cout<<"你保护了"<<protect+1<<"号船员!\n";
            Sleep(1500);
        }else{
            // AI随机选择保护目标
            while(protect==-1 || players[protect].get_status()!=alive){
                protect=rand()%player_count;
            }
        }
        
        cout<<"医生行动完成!\n\n";
        return protect;
    }
    
    // 侦探行动(调查线索)
    void detective_action(){
        color(purple);
        cout<<"侦探~请行动~~\n";
        Sleep(1500);
        
        // 玩家是侦探且存活
        if(players[my_id].role==detective && players[my_id].get_status()==alive){
            cout<<"你发现了可疑线索,选择调查哪位玩家?\n";
            int suspect;
            cin>>suspect;
            while(!(suspect>=1&&suspect<=player_count)){
                cout<<"无效目标!重新输入:\n";
                cin>>suspect;
            }
            suspect--;
            cout<<"调查结果:";
            if(players[suspect].role==impostor){
                color(red);
                cout<<suspect+1<<"号行为异常,可能是内鬼!\n";
                players[suspect].is_visible=true;
            }else{
                color(green);
                cout<<suspect+1<<"号行为正常,是船员!\n";
            }
            Sleep(2000);
        }
        
        cout<<"侦探行动完成!\n\n";
    }
    
    // 船员执行任务
    void crewmate_tasks(){
        color(white);
        cout<<"船员开始执行任务!\n";
        Sleep(1000);
        
        for(int i=0;i<player_count;i++){
            if(players[i].role!=impostor && players[i].get_status()==alive){
                if(i==my_id){
                    cout<<"\n你需要完成任务:";
                    int task_choice;
                    cout<<"1=维修电路 2=清理管道 3=检查引擎\n";
                    cin>>task_choice;
                    // 随机增加任务进度
                    players[i].task_progress+=rand()%30+10;
                    if(players[i].task_progress>100) players[i].task_progress=100;
                    cout<<"任务完成!当前进度:"<<players[i].task_progress<<"%\n";
                }else{
                    // AI船员执行任务
                    players[i].task_progress+=rand()%20+5;
                    if(players[i].task_progress>100) players[i].task_progress=100;
                }
                Sleep(500);
            }
        }
        
        cout<<"\n任务阶段结束!\n";
        Sleep(1500);
    }
    
    // 紧急会议(投票驱逐)
    int emergency_meeting(){
        system("cls");
        print_game();
        color(red);
        gotoxy(0,7);
        cout<<"________________________\n";
        cout<<"紧急会议!全体船员集合!\n";
        Sleep(2000);
        
        int votes[15]={0};
        memset(votes,0,sizeof(votes));
        color(white);
        cout<<"开始投票!选择你怀疑的内鬼:\n";
        Sleep(1000);
        
        // 重投标记(最多重投1次)
        static int retry_count = 0;
        
        VOTE_AGAIN:
        // 重置投票统计变量
        int max_votes = 0;
        int eject_id = -1;
        int tie_count = 0;
        int tie_ids[15]={-1};
        memset(votes, 0, sizeof(votes)); // 清空票数
        
        // 投票阶段
        for(int i=0;i<player_count;i++){
            if(players[i].get_status()==alive){
                if(i==my_id){
                    cout<<"\n你的投票:";
                    int vote;
                    cin>>vote;
                    while(!(vote>=1&&vote<=player_count)){
                        cout<<"无效投票!重新输入:\n";
                        cin>>vote;
                    }
                    vote--;
                    votes[vote]++;
                    cout<<"你投票给了"<<vote+1<<"号!\n";
                }else{
                    // AI投票(仅投存活玩家)
                    int ai_vote;
                    do {
                        ai_vote = rand()%player_count;
                    } while(players[ai_vote].status != alive);
                    votes[ai_vote]++;
                    cout<<i+1<<"号投票给了"<<ai_vote+1<<"号!\n";
                }
                Sleep(800);
            }
        }
        
        // 统计票数
        for(int i=0;i<player_count;i++){
            if(players[i].status != alive) continue; // 跳过非存活玩家
            if(votes[i]>max_votes){
                max_votes = votes[i];
                eject_id = i;
                tie_count = 0;
                tie_ids[0] = i;
            }else if(votes[i]==max_votes && max_votes>0){
                tie_count++;
                tie_ids[tie_count] = i;
            }
        }
        
        // 平票处理(最多重投1次)
        if(tie_count>0 && retry_count < 1){
            color(yellow);
            cout<<"\n投票平票!重新投票:\n";
            retry_count++;
            Sleep(1500);
            goto VOTE_AGAIN;
        }else if(tie_count>0){
            color(blue);
            cout<<"\n再次平票,会议结束!\n";
            Sleep(2000);
            retry_count = 0;
            return -1;
        }
        
        // 无有效投票
        if(max_votes==0){
            color(blue);
            cout<<"\n无人获得票数,会议结束!\n";
            Sleep(2000);
            retry_count = 0;
            return -1;
        }
        
        // 驱逐最高票玩家
        color(red);
        cout<<"\n"<<eject_id+1<<"号获得最高票数!\n";
        Sleep(1500);
        cout<<eject_id+1<<"号被驱逐出飞船!\n";
        players[eject_id].status=ejected;
        
        // 显示真实身份
        color(white);
        cout<<"真实身份:";
        switch(players[eject_id].role){
            case crewmate: color(green);cout<<"船员\n";break;
            case impostor: color(red);cout<<"内鬼\n";break;
            case engineer: color(cyan);cout<<"工程师\n";break;
            case medic: color(green);cout<<"医生\n";break;
            case detective: color(purple);cout<<"侦探\n";break;
        }
        
        Sleep(3000);
        retry_count = 0;
        return eject_id;
    }
    
    // 处理内鬼击杀逻辑
    void process_kill(){
        killed_player=impostor_action();
        // 被保护的玩家无法被击杀
        if(killed_player==shielded_player){
            color(green);
            cout<<killed_player+1<<"号被医生保护,袭击失败!\n";
            killed_player=-1;
        }else if(killed_player!=-1){
            color(red);
            cout<<killed_player+1<<"号被内鬼袭击!已死亡!\n";
            players[killed_player].status=dead;
            // 增加内鬼击杀数
            for(int i=0; i<impostor_count; i++){
                if(players[impostor_ids[i]].status == alive){
                    players[impostor_ids[i]].kill_count++;
                    break;
                }
            }
        }
        Sleep(2000);
    }
    
    // 游戏回合逻辑
    void game_round(){
        current_phase=game_day;
        system("cls");
        print_game();
        color(blue);
        gotoxy(0,7);
        cout<<"________________________\n";
        cout<<"日常阶段 | 船员自由活动中...\n";
        Sleep(2000);
        
        // 重置本轮变量
        shielded_player=-1;
        killed_player=-1;
        
        // 任务阶段
        current_phase=game_task;
        system("cls");
        print_game();
        color(cyan);
        gotoxy(0,7);
        cout<<"________________________\n";
        cout<<"任务阶段开始!\n";
        
        // 特殊身份行动
        if(player_count>=12) repaired_task=engineer_action(); // 工程师
        if(player_count>=8) shielded_player=medic_action();   // 医生
        if(player_count>=10) detective_action();              // 侦探
        
        // 内鬼袭击
        process_kill();
        
        // 无人死亡则执行任务
        if(killed_player==-1){ 
            crewmate_tasks();
        }
        
        // 触发紧急会议(有人死亡 或 随机触发)
        if(killed_player!=-1 || rand()%3==0){
            current_phase=game_meeting;
            ejected_player=emergency_meeting();
        }
        
        round_num++;
    }
    
    // 游戏结束结算
    void game_over(){
        system("cls");
        color(white);
        
        int result=check_game_end();
        if(result==1){
            color(red);
            cout<<"========== 游戏结束 ==========\n";
            cout<<"          内鬼胜利!\n";
            cout<<"==============================\n\n";
        }else if(result==2){
            color(green);
            cout<<"========== 游戏结束 ==========\n";
            cout<<"          船员胜利!\n";
            cout<<"==============================\n\n";
        }
        
        color(white);
        cout<<"最终统计:\n";
        for(int i=0;i<player_count;i++){
            cout<<i+1<<"号: ";
            // 打印身份
            switch(players[i].role){
                case crewmate: color(green);cout<<"船员";break;
                case impostor: color(red);cout<<"内鬼";break;
                case engineer: color(cyan);cout<<"工程师";break;
                case medic: color(green);cout<<"医生";break;
                case detective: color(purple);cout<<"侦探";break;
            }
            
            color(white);
            cout<<" | 状态:";
            if(players[i].status==alive) cout<<"存活";
            else if(players[i].status==dead) cout<<"被击杀";
            else cout<<"被驱逐";
            
            // 打印额外信息
            if(players[i].role==crewmate){
                cout<<" | 任务进度:"<<players[i].task_progress<<"%";
            }else if(players[i].role==impostor){
                cout<<" | 击杀数:"<<players[i].kill_count;
            }
            cout<<endl;
        }
    }
    
    // 主函数
    int main(){
        game_init();
        while(!check_game_end()){
            game_round();
            system("cls");
            print_game();
            if(check_game_end()) break;
            color(blue);
            cout<<"\n\n按任意键继续下一轮...";
            _getch();
        }
        game_over();
        system("pause");
        return 0;
    }
    
    • 1