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

0 条评论

目前还没有评论...