- 编程
太空杀(基础版)
- @ 2025-12-6 14:19:52
#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 条评论
-
-
发错了这个才是 #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