#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;
// 船员胜利条件1:所有内鬼被淘汰
if(alive_impostor==0) return 2;
// 船员胜利条件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{
    // 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);

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);
    }
}

// 统计投票
int max_votes=-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;

}

2 条评论

  • @ 2025-12-6 14:24:15

    出现了bug 用不了

    • @ 2025-12-6 14:21:43

      发错了这个才是 #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;
      // 船员胜利条件1:所有内鬼被淘汰
      if(alive_impostor==0) return 2;
      // 船员胜利条件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{
          // 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);
      
      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);
          }
      }
      
      // 统计投票
      int max_votes=-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