#include<bits/stdc++.h> #include<windows.h> #include<conio.h> #include #include using namespace std;

const int game_day=0, game_task=1, game_meeting=2, game_siege=3;
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 technician=5, watcher=6, spy=7; 
const int tracker=8, bomber=9, cleaner=10, seer=11;
const int decoy=12, hacker=13, guard=14, trickster=15;
const int alive=0, dead=1, ejected=2;

const int room_engine=0, room_electric=1, room_security=2, room_medbay=3, room_storage=4;
const int room_count=5;
bool room_destroyed[room_count]={false};
int current_room=-1;

int impostor_count=0;          
int engineer_id=-1, medic_id=-1, detective_id=-1;
int technician_id=-1, watcher_id=-1, spy_id=-1; 
int tracker_id=-1, bomber_id=-1, cleaner_id=-1, seer_id=-1;
int decoy_id=-1, hacker_id=-1, guard_id=-1, trickster_id=-1;
int impostor_ids[6]={-1,-1,-1,-1,-1,-1};
int ejected_player=-1;          
int killed_player=-1;           
int shielded_player=-1;         
int repaired_task=-1;           
bool security_camera_active=false;
bool bomb_planted=false;
int bomb_room=-1;
int bomb_timer=2;
int cleaned_body=-1;
int global_task_progress=0;
bool trickster_fake_kill_flag=false;
int guard_protect_room=-1;

void color(int 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;
    case cyan:SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);break;
    case orange:SetConsoleTextAttribute(hConsole, 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 kill_count;    
bool is_visible;   
int current_room;
int camera_time;
int track_target;
int seer_cooldown;
bool decoy_fake_dead;
int hacker_cooldown;
int guard_cooldown;
int trickster_cooldown;

Player(){
    role=-1;
    status=alive;
    kill_count=0;
    is_visible=false;
    current_room=0;
    camera_time=0;
    track_target=-1;
    seer_cooldown=0;
    decoy_fake_dead=false;
    hacker_cooldown=0;
    guard_cooldown=0;
    trickster_cooldown=0;
}

int get_status(){
    return status;
}
};

Player players[20];

bool is_include(int arr[], int val, int len){
for(int i=0;i<len;i++){
    if(arr[i]==val) return true;
}
return false;
}

bool typing_task(){
color(cyan);
cout << "\n=== 精准打字任务 ===" << endl;
string texts[] = {
    "repair the electrical system",
    "check the engine temperature",
    "calibrate the navigation system",
    "analyze the oxygen level",
    "verify the security protocol"
};

string target = texts[rand()%5];
cout << "请准确输入以下内容:" << target << endl;
cout << "输入:";

string input;
cin >> ws;
getline(cin, input);

if(input == target){
    color(green);
    cout << "输入正确!任务完成!" << endl;
    return true;
}else{
    color(red);
    cout << "输入错误!任务失败!正确内容:" << target << endl;
    return false;
}
}

string get_room_name(int room_id){
switch(room_id){
    case room_engine: return "引擎室";
    case room_electric: return "电力室";
    case room_security: return "监控室";
    case room_medbay: return "医疗室";
    case room_storage: return "储藏室";
    default: return "未知区域";
}
}

void init_players(){
my_id=rand()%player_count;
global_task_progress=0;

if(player_count<=6) impostor_count=1;
else if(player_count<=10) impostor_count=2;
else if(player_count<=15) impostor_count=3;
else impostor_count=4;

for(int i=0;i<player_count;i++){
    players[i].status=alive;
    players[i].kill_count=0;
    players[i].is_visible=false;
    players[i].role=-1;
    players[i].current_room=rand()%room_count;
    players[i].camera_time=0;
    players[i].track_target=-1;
    players[i].seer_cooldown=0;
    players[i].decoy_fake_dead=false;
    players[i].hacker_cooldown=0;
    players[i].guard_cooldown=0;
    players[i].trickster_cooldown=0;
}

for(int i=0;i<impostor_count;i++){
    int p=rand()%player_count;
    if(!is_include(impostor_ids, p, 6)){
        impostor_ids[i]=p;
        players[p].role=impostor;
    }else{
        i--;
    }
    Sleep(rand()%80+100);
}

if(player_count>=10 && impostor_count>=2){
    do{
        bomber_id=rand()%player_count;
    }while(players[bomber_id].role!=-1);
    players[bomber_id].role=bomber;
    impostor_ids[impostor_count++] = bomber_id;
}

if(player_count>=12 && impostor_count>=2){
    do{
        cleaner_id=rand()%player_count;
    }while(players[cleaner_id].role!=-1);
    players[cleaner_id].role=cleaner;
    impostor_ids[impostor_count++] = cleaner_id;
}

if(player_count>=13 && impostor_count>=3){
    do{
        spy_id=rand()%player_count;
    }while(players[spy_id].role!=-1);
    players[spy_id].role=spy;
    impostor_ids[impostor_count++] = spy_id;
}

if(player_count>=15 && impostor_count>=3){
    do{
        trickster_id=rand()%player_count;
    }while(players[trickster_id].role!=-1);
    players[trickster_id].role=trickster;
    impostor_ids[impostor_count++] = trickster_id;
}

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

if(player_count>=9){
    do{
        technician_id=rand()%player_count;
    }while(players[technician_id].role!=-1);
    players[technician_id].role=technician;
}

if(player_count>=11){
    do{
        watcher_id=rand()%player_count;
    }while(players[watcher_id].role!=-1);
    players[watcher_id].role=watcher;
}

if(player_count>=8){
    do{
        tracker_id=rand()%player_count;
    }while(players[tracker_id].role!=-1);
    players[tracker_id].role=tracker;
}

if(player_count>=11){
    do{
        seer_id=rand()%player_count;
    }while(players[seer_id].role!=-1);
    players[seer_id].role=seer;
}

if(player_count>=14){
    do{
        decoy_id=rand()%player_count;
    }while(players[decoy_id].role!=-1);
    players[decoy_id].role=decoy;
}

if(player_count>=16){
    do{
        hacker_id=rand()%player_count;
    }while(players[hacker_id].role!=-1);
    players[hacker_id].role=hacker;
}

if(player_count>=18){
    do{
        guard_id=rand()%player_count;
    }while(players[guard_id].role!=-1);
    players[guard_id].role=guard;
}

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 || players[my_id].role==spy || 
   players[my_id].role==bomber || players[my_id].role==cleaner ||
   players[my_id].role==trickster){
    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 if(current_phase==game_siege) color(orange);
else color(blue);

printf("第%d回合 | ",round_num);
if(current_phase==game_day) cout<<"日常阶段";
else if(current_phase==game_task) cout<<"任务阶段";
else if(current_phase==game_meeting) cout<<"紧急会议";
else cout<<"破坏阶段";

gotoxy(130,0);
if(bomb_planted){
    color(red);
    cout<<"【炸弹警告】"<<get_room_name(bomb_room)<<" 剩余"<<bomb_timer<<"回合爆炸!";
}

gotoxy(0,3);
color(blue);
cout<<" 我的编号:"<<my_id+1;
cout<<" | 当前房间:"<<get_room_name(players[my_id].current_room);

gotoxy(0,4);
color(green);
cout<<" 全局任务进度:"<<global_task_progress<<"% (船员需达到100%获胜)";

gotoxy(60,3);
color(yellow);
cout<<"=== 区域状态 ===";
for(int i=0;i<room_count;i++){
    gotoxy(60,4+i);
    if(room_destroyed[i]){
        color(red);
        cout<<get_room_name(i)<<": 已破坏";
    }else{
        color(green);
        cout<<get_room_name(i)<<": 正常";
    }
    if(guard_protect_room == i){
        color(cyan);
        cout<<" [守卫保护]";
    }
}

int col=0, row=10;
for(int i=0;i<player_count;i++){
    gotoxy(col*12+1,row);
    color(blue);
    cout<<i+1<<"号"; 
    
    gotoxy(col*12+1,row+1);
    if(players[i].get_status()==dead){
        color(red);
        cout<<"已死亡";
    }else if(players[i].get_status()==ejected){
        color(yellow);
        cout<<"被驱逐";
    }else{
        color(green);
        cout<<"存活中";
        if(players[i].decoy_fake_dead){
            color(orange);
            cout<<"[假死]";
        }
    }
    
    gotoxy(col*12+1,row+2);
    color(cyan);
    cout<<"房间:"<<get_room_name(players[i].current_room);
    
    gotoxy(col*12+1,row+3);
    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;
            case technician: cout<<"技术员";break;
            case watcher: cout<<"守望者";break;
            case spy: cout<<"间谍(内鬼)";break;
            case tracker: cout<<"追踪者";break;
            case bomber: cout<<"爆破手(内鬼)";break;
            case cleaner: cout<<"清洁工(内鬼)";break;
            case seer: cout<<"预言家";break;
            case decoy: cout<<"诱饵";break;
            case hacker: cout<<"黑客";break;
            case guard: cout<<"守卫";break;
            case trickster: cout<<"欺诈师(内鬼)";break;
        }
    }else{
        cout<<"未知";
    }
    
    col++;
    if(col >= 15){
        col=0;
        row+=5;
    }
}

gotoxy(0, 40);
color(purple);
cout<<"=== 监控系统 ===";
if(security_camera_active){
    cout<<" [已开启]";
    color(white);
    cout<<"\n监控可见玩家位置:";
    for(int i=0;i<player_count;i++){
        if(players[i].status==alive){
            cout<<i+1<<"号("<<get_room_name(players[i].current_room)<<") ";
        }
    }
}else{
    cout<<" [已关闭]";
}

if(players[my_id].role==tracker && players[my_id].track_target!=-1){
    gotoxy(0,42);
    color(orange);
    cout<<"=== 追踪信息 ===";
    cout<<"\n你追踪的"<<players[my_id].track_target+1<<"号当前位置:"
        <<get_room_name(players[players[my_id].track_target].current_room);
}

gotoxy(0,48);
color(white);
cout<<"________________________";
}

void impostor_destroy_room(){
color(red);
cout<<"\n=== 内鬼破坏阶段 ==="<<endl;
Sleep(1000);

if(players[my_id].role==impostor || players[my_id].role==spy || 
   players[my_id].role==bomber || players[my_id].role==cleaner ||
   players[my_id].role==trickster){
    cout<<"选择要破坏的区域:"<<endl;
    for(int i=0;i<room_count;i++){
        cout<<i+1<<". "<<get_room_name(i)<<" ("<<(room_destroyed[i]?"已破坏":"正常")<<")"<<endl;
    }
    
    int choice;
    cin>>choice;
    while(choice<1 || choice>room_count){
        color(yellow);
        cout<<"无效选择!重新输入:";
        cin>>choice;
    }
    choice--;
    
    if(guard_protect_room == choice){
        color(yellow);
        cout<<"该房间被守卫保护,无法破坏!"<<endl;
        Sleep(1500);
        return;
    }
    
    if(!room_destroyed[choice]){
        room_destroyed[choice]=true;
        color(red);
        cout<<"你破坏了"<<get_room_name(choice)<<"!船员需要尽快修复!"<<endl;
        
        if(choice==room_engine || choice==room_electric){
            color(orange);
            cout<<get_room_name(choice)<<"被破坏!全局任务进度停止增长,直到修复!"<<endl;
        }
    }else{
        color(yellow);
        cout<<get_room_name(choice)<<"已经被破坏了!"<<endl;
    }
}else{
    int ai_choice;
    do{
        ai_choice=rand()%room_count;
    }while(room_destroyed[ai_choice] || guard_protect_room == ai_choice);
    
    room_destroyed[ai_choice]=true;
    color(red);
    cout<<"内鬼破坏了"<<get_room_name(ai_choice)<<"!"<<endl;
}
Sleep(2000);
}

void bomber_plant_bomb(){
if(players[my_id].role==bomber && players[my_id].status==alive && !bomb_planted){
    color(red);
    cout<<"\n=== 爆破手技能 ==="<<endl;
    cout<<"选择布置炸弹的区域:"<<endl;
    for(int i=0;i<room_count;i++){
        cout<<i+1<<". "<<get_room_name(i)<<endl;
    }
    
    int choice;
    cin>>choice;
    while(choice<1 || choice>room_count){
        color(yellow);
        cout<<"无效选择!重新输入:";
        cin>>choice;
    }
    choice--;
    
    bomb_planted=true;
    bomb_room=choice;
    bomb_timer=2;
    color(red);
    cout<<"你在"<<get_room_name(choice)<<"布置了定时炸弹!2回合后爆炸!"<<endl;
    cout<<"船员需要拆除炸弹,否则该区域永久破坏且炸死区域内所有船员!"<<endl;
}else if(bomb_planted && players[my_id].role==bomber){
    color(yellow);
    cout<<"\n炸弹已布置!剩余"<<bomb_timer<<"回合爆炸!"<<endl;
}
Sleep(2000);
}

void defuse_bomb(){
if(!bomb_planted) return;

color(orange);
cout<<"\n=== 拆除炸弹 ==="<<endl;
cout<<get_room_name(bomb_room)<<"发现炸弹!需要拆除!"<<endl;
Sleep(1000);

if(players[my_id].status==alive && players[my_id].current_room==bomb_room && 
   players[my_id].role!=impostor && players[my_id].role!=spy && 
   players[my_id].role!=bomber && players[my_id].role!=cleaner &&
   players[my_id].role!=trickster){
    cout<<"你在炸弹所在房间,是否尝试拆除?(1=是/2=否):";
    int choice;
    cin>>choice;
    
    if(choice==1){
        color(cyan);
        cout<<"拆除炸弹需要完成精准打字任务!"<<endl;
        if(typing_task()){
            bomb_planted=false;
            bomb_room=-1;
            color(green);
            cout<<"炸弹拆除成功!全局任务进度+5%!"<<endl;
            global_task_progress +=5;
            if(global_task_progress>100) global_task_progress=100;
        }else{
            color(red);
            cout<<"拆除失败!炸弹继续倒计时!"<<endl;
        }
    }
}

for(int i=0;i<player_count;i++){
    if(i!=my_id && players[i].status==alive && players[i].current_room==bomb_room && 
       players[i].role!=impostor && players[i].role!=spy && 
       players[i].role!=bomber && players[i].role!=cleaner &&
       players[i].role!=trickster){
        bool ai_success = (rand()%100)<60;
        if(players[i].role==technician || players[i].role==engineer) ai_success=true;
        
        if(ai_success){
            bomb_planted=false;
            bomb_room=-1;
            color(green);
            cout<<i+1<<"号成功拆除了炸弹!全局任务进度+5%!"<<endl;
            global_task_progress +=5;
            if(global_task_progress>100) global_task_progress=100;
            break;
        }
    }
}
Sleep(1500);
}

void bomb_explode(){
if(!bomb_planted) return;

bomb_timer--;
if(bomb_timer<=0){
    color(red);
    cout<<"\n=== 炸弹爆炸! ==="<<endl;
    cout<<get_room_name(bomb_room)<<"炸弹爆炸!该区域永久破坏!"<<endl;
    room_destroyed[bomb_room]=true;
    
    int kill_count=0;
    for(int i=0;i<player_count;i++){
        if(players[i].status==alive && players[i].current_room==bomb_room && 
           players[i].role!=impostor && players[i].role!=spy && 
           players[i].role!=bomber && players[i].role!=cleaner &&
           players[i].role!=trickster && guard_protect_room != bomb_room){
            players[i].status=dead;
            kill_count++;
            cout<<i+1<<"号在爆炸中死亡!"<<endl;
        }
    }
    
    if(kill_count>0){
        color(red);
        cout<<"共"<<kill_count<<"名船员在爆炸中死亡!"<<endl;
    }else{
        color(green);
        cout<<"该房间被守卫保护,无人伤亡!"<<endl;
    }
    
    bomb_planted=false;
    bomb_room=-1;
}
Sleep(2000);
}

void cleaner_clean_body(){
if(killed_player==-1) return;

if(players[my_id].role==cleaner && players[my_id].status==alive){
    color(yellow);
    cout<<"\n=== 清洁工技能 ==="<<endl;
    cout<<"是否清理"<<killed_player+1<<"号的尸体?(1=是/2=否):";
    int choice;
    cin>>choice;
    
    if(choice==1){
        cleaned_body=killed_player;
        color(red);
        cout<<"尸体清理成功!不会触发紧急会议!"<<endl;
        killed_player=-1;
    }
}else if(cleaner_id!=-1 && players[cleaner_id].status==alive && killed_player!=-1){
    cleaned_body=killed_player;
    color(red);
    cout<<"清洁工清理了"<<killed_player+1<<"号的尸体!"<<endl;
    killed_player=-1;
}
Sleep(1500);
}

void tracker_track_target(){
if(players[my_id].role==tracker && players[my_id].status==alive){
    color(orange);
    cout<<"\n=== 追踪者技能 ==="<<endl;
    cout<<"选择要追踪的玩家(可查看其位置):"<<endl;
    
    int target;
    cin>>target;
    while(target<1 || target>player_count){
        color(yellow);
        cout<<"无效目标!重新输入:";
        cin>>target;
    }
    target--;
    
    players[my_id].track_target=target;
    color(green);
    cout<<"你开始追踪"<<target+1<<"号!本回合可查看其位置!"<<endl;
    players[target].is_visible=true;
    global_task_progress +=3;
    if(global_task_progress>100) global_task_progress=100;
    cout<<"追踪成功!全局任务进度+3%(当前:"<<global_task_progress<<"%)"<<endl;
}
Sleep(1500);
}

void seer_check_role(){
if(players[my_id].role==seer && players[my_id].status==alive && players[my_id].seer_cooldown<=0){
    color(purple);
    cout<<"\n=== 预言家技能 ==="<<endl;
    cout<<"选择要查验的玩家:"<<endl;
    
    int target;
    cin>>target;
    while(target<1 || target>player_count){
        color(yellow);
        cout<<"无效目标!重新输入:";
        cin>>target;
    }
    target--;
    
    bool error = (rand()%100)<10;
    color(white);
    cout<<"查验结果:";
    
    if(error){
        if(players[target].role==impostor || players[target].role==spy || 
           players[target].role==bomber || players[target].role==cleaner ||
           players[target].role==trickster){
            color(green);
            cout<<target+1<<"号是船员(查验出错)!"<<endl;
        }else{
            color(red);
            cout<<target+1<<"号是内鬼(查验出错)!"<<endl;
        }
    }else{
        if(players[target].role==impostor || players[target].role==spy || 
           players[target].role==bomber || players[target].role==cleaner ||
           players[target].role==trickster){
            color(red);
            cout<<target+1<<"号是内鬼!"<<endl;
            players[target].is_visible=true;
            global_task_progress +=8;
            if(global_task_progress>100) global_task_progress=100;
            cout<<"查验成功!全局任务进度+8%(当前:"<<global_task_progress<<"%)"<<endl;
        }else{
            color(green);
            cout<<target+1<<"号是船员!"<<endl;
        }
    }
    
    players[my_id].seer_cooldown=2;
}else if(players[my_id].role==seer && players[my_id].seer_cooldown>0){
    color(yellow);
    cout<<"\n预言家技能冷却中!剩余"<<players[my_id].seer_cooldown<<"回合!"<<endl;
    players[my_id].seer_cooldown--;
}
Sleep(2000);
}

void decoy_fake_death(){
if(players[my_id].role==decoy && players[my_id].status==alive && !players[my_id].decoy_fake_dead){
    color(orange);
    cout<<"\n=== 诱饵技能 ==="<<endl;
    cout<<"是否使用假死技能(迷惑内鬼,全局任务进度+5%)?(1=是/2=否):";
    int choice;
    cin>>choice;
    
    if(choice==1){
        players[my_id].decoy_fake_dead=true;
        color(yellow);
        cout<<"你进入假死状态!内鬼会误以为你已死亡!"<<endl;
        global_task_progress +=5;
        if(global_task_progress>100) global_task_progress=100;
        cout<<"假死成功!全局任务进度+5%(当前:"<<global_task_progress<<"%)"<<endl;
    }
}else if(players[my_id].role==decoy && players[my_id].decoy_fake_dead){
    color(green);
    cout<<"\n=== 诱饵技能 ==="<<endl;
    cout<<"是否解除假死状态?(1=是/2=否):";
    int choice;
    cin>>choice;
    
    if(choice==1){
        players[my_id].decoy_fake_dead=false;
        color(green);
        cout<<"你解除了假死状态!"<<endl;
    }
}
Sleep(1500);
}

void hacker_jammer(){
if(players[my_id].role==hacker && players[my_id].status==alive && players[my_id].hacker_cooldown<=0){
    color(blue);
    cout<<"\n=== 黑客技能 ==="<<endl;
    cout<<"是否使用干扰技能(禁用所有内鬼技能1回合,全局任务进度+7%)?(1=是/2=否):";
    int choice;
    cin>>choice;
    
    if(choice==1){
        color(red);
        cout<<"你启动了电子干扰!所有内鬼本回合无法使用技能!"<<endl;
        global_task_progress +=7;
        if(global_task_progress>100) global_task_progress=100;
        cout<<"干扰成功!全局任务进度+7%(当前:"<<global_task_progress<<"%)"<<endl;
        players[my_id].hacker_cooldown=3;
        bomb_planted=false;
        trickster_fake_kill_flag=false;
    }
}else if(players[my_id].role==hacker && players[my_id].hacker_cooldown>0){
    color(yellow);
    cout<<"\n黑客技能冷却中!剩余"<<players[my_id].hacker_cooldown<<"回合!"<<endl;
    players[my_id].hacker_cooldown--;
}
Sleep(1500);
}

void guard_protect(){
if(players[my_id].role==guard && players[my_id].status==alive && players[my_id].guard_cooldown<=0){
    color(cyan);
    cout<<"\n=== 守卫技能 ==="<<endl;
    cout<<"选择要保护的房间(该房间无法被破坏/爆炸,全局任务进度+4%):"<<endl;
    for(int i=0;i<room_count;i++){
        cout<<i+1<<". "<<get_room_name(i)<<endl;
    }
    
    int choice;
    cin>>choice;
    while(choice<1 || choice>room_count){
        color(yellow);
        cout<<"无效选择!重新输入:";
        cin>>choice;
    }
    choice--;
    
    guard_protect_room=choice;
    color(green);
    cout<<"你保护了"<<get_room_name(choice)<<"!该房间本回合无法被破坏/爆炸!"<<endl;
    global_task_progress +=4;
    if(global_task_progress>100) global_task_progress=100;
    cout<<"保护成功!全局任务进度+4%(当前:"<<global_task_progress<<"%)"<<endl;
    players[my_id].guard_cooldown=2;
}else if(players[my_id].role==guard && players[my_id].guard_cooldown>0){
    color(yellow);
    cout<<"\n守卫技能冷却中!剩余"<<players[my_id].guard_cooldown<<"回合!"<<endl;
    players[my_id].guard_cooldown--;
    if(players[my_id].guard_cooldown == 0){
        guard_protect_room=-1;
        cout<<"房间保护状态已解除!"<<endl;
    }
}
Sleep(1500);
}

void trickster_fake_kill(){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

if(players[my_id].role==trickster && players[my_id].status==alive && players[my_id].trickster_cooldown<=0){
    color(red);
    cout<<"\n=== 欺诈师技能 ==="<<endl;
    cout<<"是否使用假击杀技能(制造击杀假象,触发紧急会议)?(1=是/2=否):";
    int choice;
    while(!(cin >> choice) || choice < 1 || choice > 2){
        color(yellow);
        cout<<"输入无效!请输入 1 或 2:";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    
    if(choice==1){
        trickster_fake_kill_flag=true;
        color(orange);
        cout<<"你制造了假击杀假象!船员会触发紧急会议!"<<endl;
        players[my_id].trickster_cooldown=3;
    }
}else if(players[my_id].role==trickster && players[my_id].trickster_cooldown>0){
    color(yellow);
    cout<<"\n欺诈师技能冷却中!剩余"<<players[my_id].trickster_cooldown<<"回合!"<<endl;
    players[my_id].trickster_cooldown--;
}
Sleep(1500);
}

void repair_room(){
color(green);
cout<<"\n=== 修复破坏区域 ==="<<endl;
Sleep(1000);

bool has_destroyed=false;
for(int i=0;i<room_count;i++){
    if(room_destroyed[i]){
        has_destroyed=true;
        break;
    }
}

if(!has_destroyed){
    cout<<"当前没有被破坏的区域!"<<endl;
    Sleep(1000);
    return;
}

if(players[my_id].status==alive && players[my_id].role!=impostor && players[my_id].role!=spy && 
   players[my_id].role!=bomber && players[my_id].role!=cleaner &&
   players[my_id].role!=trickster){
    cout<<"选择要修复的区域:"<<endl;
    int idx=1;
    int repair_choices[room_count];
    memset(repair_choices, -1, sizeof(repair_choices));
    for(int i=0;i<room_count;i++){
        if(room_destroyed[i]){
            repair_choices[idx-1]=i;
            cout<<idx<<". "<<get_room_name(i)<<endl;
            idx++;
        }
    }
    
    int choice;
    cin>>choice;
    while(choice<1 || choice>=idx){
        color(yellow);
        cout<<"无效选择!重新输入:";
        cin>>choice;
    }
    choice=repair_choices[choice-1];
    
    bool success;
    if(players[my_id].role==technician){
        success=true;
    }else{
        success=typing_task();
    }
    
    if(success){
        room_destroyed[choice]=false;
        color(green);
        cout<<"你成功修复了"<<get_room_name(choice)<<"!"<<endl;
        
        int progress_add = (players[my_id].role==technician) ? 10 : 5;
        global_task_progress += progress_add;
        if(global_task_progress>100) global_task_progress=100;
        cout<<"修复成功!全局任务进度+"<<progress_add<<"%(当前:"<<global_task_progress<<"%)"<<endl;
    }
}

for(int i=0;i<player_count;i++){
    if(i!=my_id && players[i].status==alive && players[i].role!=impostor && players[i].role!=spy && 
       players[i].role!=bomber && players[i].role!=cleaner &&
       players[i].role!=trickster){
        for(int j=0;j<room_count;j++){
            if(room_destroyed[j]){
                bool ai_success = (rand()%100)<70;
                if(players[i].role==technician) ai_success=true;
                
                if(ai_success){
                    room_destroyed[j]=false;
                    color(green);
                    cout<<i+1<<"号修复了"<<get_room_name(j)<<"!"<<endl;
                    global_task_progress +=3;
                    if(global_task_progress>100) global_task_progress=100;
                    break;
                }
            }
        }
    }
}
Sleep(2000);
}

void watcher_activate_camera(){
if(players[my_id].role==watcher && players[my_id].status==alive){
    color(purple);
    cout<<"\n=== 守望者技能 ==="<<endl;
    cout<<"是否开启监控室摄像头?(1=是/2=否):";
    
    int choice;
    cin>>choice;
    if(choice==1){
        security_camera_active=true;
        players[my_id].camera_time=3;
        color(green);
        cout<<"监控已开启!你可以看到所有玩家的位置(持续3回合)"<<endl;
        global_task_progress +=4;
        if(global_task_progress>100) global_task_progress=100;
        cout<<"监控开启!全局任务进度+4%(当前:"<<global_task_progress<<"%)"<<endl;
    }else{
        cout<<"你选择不开启监控"<<endl;
    }
}
Sleep(1500);
}

int check_game_end(){
int alive_crew=0, alive_impostor=0;
int total_crew=player_count-impostor_count;

for(int i=0;i<player_count;i++){
    if(players[i].get_status()==alive && !players[i].decoy_fake_dead){
        if(players[i].role==impostor || players[i].role==spy || 
           players[i].role==bomber || players[i].role==cleaner ||
           players[i].role==trickster) alive_impostor++;
        else alive_crew++;
    }
}

bool all_destroyed=true;
for(int i=0;i<room_count;i++){
    if(!room_destroyed[i]){
        all_destroyed=false;
        break;
    }
}
if(all_destroyed) return 1;

if(alive_crew<=alive_impostor && alive_impostor>0) return 1;
if(alive_impostor==0) return 2;
if(global_task_progress>=100) return 2;
return 0;
}

void game_init(){
srand(time(NULL));
init_window();

color(green);
cout<<"欢迎来到太空杀游戏!\n";
cout<<"===== 新增角色 =====\n";
cout<<"1. 技术员(修复速度翻倍)、守望者(可开监控)、间谍(伪装内鬼)\n";
cout<<"2. 追踪者(查看玩家位置)、预言家(查验阵营)、爆破手(布置炸弹)\n";
cout<<"3. 清洁工(清理尸体,不触发会议)、诱饵(假死)、黑客(干扰)、守卫(保护房间)、欺诈师(假击杀)\n";
cout<<"===== 新增机制 =====\n";
cout<<"1. 精准打字任务:必须准确输入字符才能完成\n";
cout<<"2. 重要区域破坏:内鬼可破坏区域,船员需修复\n";
cout<<"3. 定时炸弹:爆破手布置,船员需拆除否则爆炸\n";
cout<<"4. 房间系统:引擎室/电力室/监控室/医疗室/储藏室\n";
cout<<"5. 全局任务进度:船员需共同完成100%任务获胜\n";
cout<<"====================\n";
cout<<"规则:内鬼需要杀死船员/破坏区域,船员需要完成全局任务/修复区域/找出内鬼\n";
cout<<"______________________\n";
cout<<"请输入玩家人数(4-20人):";
cin>>player_count;

while(player_count<4||player_count>20){
    cout<<"请重新输入(4-20)!\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;
    case technician: cout<<"技术员\n";break;
    case watcher: cout<<"守望者\n";break;
    case spy: cout<<"间谍(内鬼)\n";break;
    case tracker: cout<<"追踪者\n";break;
    case bomber: cout<<"爆破手(内鬼)\n";break;
    case cleaner: cout<<"清洁工(内鬼)\n";break;
    case seer: cout<<"预言家\n";break;
    case decoy: cout<<"诱饵\n";break;
    case hacker: cout<<"黑客\n";break;
    case guard: cout<<"守卫\n";break;
    case trickster: cout<<"欺诈师(内鬼)\n";break;
}
cout<<"初始房间:"<<get_room_name(players[my_id].current_room)<<endl;

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].role==spy || 
    players[my_id].role==bomber || players[my_id].role==cleaner ||
    players[my_id].role==trickster) && 
    players[my_id].get_status()==alive){
    cin>>target;
    while(!(target>=1&&target<=player_count&&players[target-1].get_status()==alive&&
           !players[target-1].decoy_fake_dead&&
           players[target-1].role!=impostor&&players[target-1].role!=spy&&
           players[target-1].role!=bomber&&players[target-1].role!=cleaner&&
           players[target-1].role!=trickster)){
        cout<<"无效目标!重新输入:\n";
        cin>>target;
    }
    target--;
    if(players[my_id].role==trickster && !trickster_fake_kill_flag){
        color(orange);
        cout<<"你选择对"<<target+1<<"号使用假击杀!"<<endl;
        trickster_fake_kill_flag=true;
        target=-1;
    }else{
        cout<<"你选择袭击"<<target+1<<"号船员!"<<endl;
    }
    Sleep(2000);
}else{
    while(target==-1 || players[target].get_status()!=alive || players[target].decoy_fake_dead || 
          players[target].role==impostor || players[target].role==spy || 
          players[target].role==bomber || players[target].role==cleaner ||
          players[target].role==trickster){
        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;
        if(typing_task()){
            cout<<"你修复了损坏的设施!\n";
            global_task_progress +=8;
            if(global_task_progress>100) global_task_progress=100;
            cout<<"修复成功!全局任务进度+8%(当前:"<<global_task_progress<<"%)"<<endl;
        }else{
            repair=0;
        }
    }else{
        repair=0;
        cout<<"你选择不修复设施!\n";
    }
    Sleep(1500);
}else{
    repair=rand()%2;
    if(repair==1){
        global_task_progress +=5;
        if(global_task_progress>100) global_task_progress=100;
    }
}

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&&
           !players[protect-1].decoy_fake_dead)){
        cout<<"无效目标!重新输入:\n";
        cin>>protect;
    }
    protect--;
    cout<<"你保护了"<<protect+1<<"号船员!\n";
    global_task_progress +=3;
    if(global_task_progress>100) global_task_progress=100;
    cout<<"保护成功!全局任务进度+3%(当前:"<<global_task_progress<<"%)"<<endl;
    Sleep(1500);
}else{
    while(protect==-1 || players[protect].get_status()!=alive || players[protect].decoy_fake_dead){
        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;
        global_task_progress +=6;
        if(global_task_progress>100) global_task_progress=100;
        cout<<"调查成功!全局任务进度+6%(当前:"<<global_task_progress<<"%)"<<endl;
    }else if(players[suspect].role==spy || players[suspect].role==bomber || 
             players[suspect].role==cleaner || players[suspect].role==trickster){
        color(green);
        cout<<suspect+1<<"号行为正常,是船员!\n";
    }else{
        color(green);
        cout<<suspect+1<<"号行为正常,是船员!\n";
    }
    Sleep(2000);
}

cout<<"侦探行动完成!\n\n";
}

void crewmate_tasks(){
color(white);
cout<<"船员开始执行全局任务!\n";
Sleep(1000);

bool task_blocked = (room_destroyed[room_engine] || room_destroyed[room_electric]);

if(players[my_id].status==alive && players[my_id].role!=impostor && players[my_id].role!=spy && 
   players[my_id].role!=bomber && players[my_id].role!=cleaner &&
   players[my_id].role!=trickster){
    cout<<"\n你需要完成全局任务:";
    int task_choice;
    cout<<"1=维修电路(打字任务) 2=清理管道 3=检查引擎\n";
    cin>>task_choice;
    
    int add_progress=0;
    if(task_choice==1){
        if(typing_task() && !task_blocked){
            add_progress=rand()%8+5;
        }
    }else if(!task_blocked){
        add_progress=rand()%5+2;
    }
    
    if(add_progress>0){
        global_task_progress += add_progress;
        if(global_task_progress>100) global_task_progress=100;
        cout<<"任务完成!全局任务进度+"<<add_progress<<"%(当前:"<<global_task_progress<<"%)\n";
    }
    
    if(task_blocked){
        color(orange);
        cout<<"警告:重要区域被破坏!全局任务进度未增长!\n";
    }
}

for(int i=0;i<player_count;i++){
    if(i!=my_id && (players[i].role!=impostor && players[i].role!=spy && 
        players[i].role!=bomber && players[i].role!=cleaner &&
        players[i].role!=trickster) && 
        players[i].get_status()==alive && !task_blocked){
        int ai_add=rand()%4+1;
        global_task_progress += ai_add;
        if(global_task_progress>100) global_task_progress=100;
        Sleep(300);
    }
}

cout<<"\n全局任务阶段结束!当前进度:"<<global_task_progress<<"%\n";
Sleep(1500);
}

int emergency_meeting(){
system("cls");
print_game();

color(red);
gotoxy(0,52);
cout<<"________________________\n";
cout<<"紧急会议!全体船员集合!\n";
Sleep(2000);

int votes[20]={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 && !players[i].decoy_fake_dead){
        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{
            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[20]={-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;
    case technician: color(orange);cout<<"技术员\n";break;
    case watcher: color(blue);cout<<"守望者\n";break;
    case spy: color(red);cout<<"间谍(内鬼)\n";break;
    case tracker: color(orange);cout<<"追踪者\n";break;
    case bomber: color(red);cout<<"爆破手(内鬼)\n";break;
    case cleaner: color(red);cout<<"清洁工(内鬼)\n";break;
    case seer: color(purple);cout<<"预言家\n";break;
    case decoy: color(orange);cout<<"诱饵\n";break;
    case hacker: color(blue);cout<<"黑客\n";break;
    case guard: color(cyan);cout<<"守卫\n";break;
    case trickster: color(red);cout<<"欺诈师(内鬼)\n";break;
}

Sleep(3000);
return eject_id;
}

void process_kill(){
killed_player=impostor_action();

if(trickster_fake_kill_flag){
    color(orange);
    cout<<"欺诈师制造了假击杀假象!触发紧急会议!"<<endl;
    trickster_fake_kill_flag=false;
    killed_player=-1;
    Sleep(2000);
    return;
}

if(killed_player==shielded_player){
    color(green);
    cout<<killed_player+1<<"号被医生保护,袭击失败!\n";
    killed_player=-1;
}else if(killed_player!=-1){
    if(players[killed_player].current_room == guard_protect_room){
        color(cyan);
        cout<<killed_player+1<<"号所在房间被守卫保护,袭击失败!\n";
        killed_player=-1;
    }else{
        color(red);
        cout<<killed_player+1<<"号被内鬼袭击!已死亡!\n";
        players[killed_player].status=dead;
        players[killed_player].kill_count++;
        
        if(players[my_id].role==spy || players[my_id].role==bomber || 
           players[my_id].role==cleaner || players[my_id].role==trickster){
            color(yellow);
            cout<<"你(特殊内鬼)的伪装生效!没有玩家发现你的身份!\n";
        }
        
        cleaner_clean_body();
    }
}
Sleep(2000);
}

void player_move_room(){
color(cyan);
cout<<"\n=== 移动房间 ==="<<endl;
cout<<"当前房间:"<<get_room_name(players[my_id].current_room)<<endl;
cout<<"选择要移动到的房间:"<<endl;
for(int i=0;i<room_count;i++){
    cout<<i+1<<". "<<get_room_name(i)<<endl;
}

int choice;
cin>>choice;
while(choice<1 || choice>room_count){
    color(yellow);
    cout<<"无效选择!重新输入:";
    cin>>choice;
}
choice--;

players[my_id].current_room=choice;
if(players[my_id].role==decoy && players[my_id].decoy_fake_dead){
    players[my_id].decoy_fake_dead=false;
    color(green);
    cout<<"你移动后自动解除假死状态!"<<endl;
}
color(green);
cout<<"你移动到了"<<get_room_name(choice)<<"!"<<endl;

for(int i=0;i<player_count;i++){
    if(i!=my_id && players[i].status==alive){
        int ai_move=rand()%room_count;
        players[i].current_room=ai_move;
        if(players[i].role==decoy && players[i].decoy_fake_dead){
            players[i].decoy_fake_dead=false;
        }
    }
}
Sleep(1000);
}

void game_round(){
current_phase=game_day;
system("cls");
print_game();

color(blue);
gotoxy(0,52);
cout<<"________________________\n";
cout<<"日常阶段 | 船员自由活动中...\n";
Sleep(2000);

player_move_room();

watcher_activate_camera();
tracker_track_target();
seer_check_role();
decoy_fake_death();
hacker_jammer();
guard_protect();

current_phase=game_siege;
system("cls");
print_game();
impostor_destroy_room();
bomber_plant_bomb();
trickster_fake_kill();

current_phase=game_task;
system("cls");
print_game();

color(cyan);
gotoxy(0,52);
cout<<"________________________\n";
cout<<"任务阶段开始!\n";

defuse_bomb();
bomb_explode();

repair_room();

shielded_player=-1;
killed_player=-1;

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(security_camera_active){
    players[watcher_id].camera_time--;
    if(players[watcher_id].camera_time<=0){
        security_camera_active=false;
        color(yellow);
        cout<<"监控时间结束!摄像头已关闭!"<<endl;
        Sleep(1000);
    }
}

if(killed_player!=-1 || trickster_fake_kill_flag || rand()%3==0 || room_destroyed[room_engine] || 
   room_destroyed[room_electric] || (bomb_planted && bomb_timer<=1)){
    current_phase=game_meeting;
    ejected_player=emergency_meeting();
}

round_num++;
}

int main(){
game_init();

while(true){
    game_round();
    
    int game_result=check_game_end();
    if(game_result!=0){
        system("cls");
        color(white);
        cout<<"==================== 游戏结束 ====================\n";
        if(game_result==1){
            color(red);
            cout<<"内鬼获得胜利!\n";
            cout<<"存活内鬼:";
            for(int i=0;i<impostor_count;i++){
                if(players[impostor_ids[i]].status==alive){
                    cout<<impostor_ids[i]+1<<"号 ";
                }
            }
            cout<<endl;
        }else{
            color(green);
            cout<<"船员获得胜利!\n";
            cout<<"全局任务进度:"<<global_task_progress<<"%\n";
            cout<<"存活船员:";
            for(int i=0;i<player_count;i++){
                if(players[i].status==alive && players[i].role!=impostor && 
                   players[i].role!=spy && players[i].role!=bomber && 
                   players[i].role!=cleaner && players[i].role!=trickster){
                    cout<<i+1<<"号 ";
                }
            }
            cout<<endl;
        }
        color(white);
        cout<<"==================================================\n";
        break;
    }
    
    system("pause");
    system("cls");
    print_game();
}

color(white);
cout<<"\n游戏结束!按任意键退出...\n";
_getch();
return 0;
}

3 条评论

  • @ 2025-12-16 16:58:56

    本讨论为12月16日发布 本程序不是抄袭 如有抄袭后果自负

    • @ 2025-12-16 16:58:32

      好评过20火速更新 差评过5托更一周

      • @ 2025-12-16 16:58:05

        请把我发送的第一行用换行断开 你们的白嫖是我托更的动力

        • 1