- 整理药名
科学怪蛋
- @ 2025-12-24 17:37:36
#include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace std; const int daytime=0,night=1; int day=0, during_time=daytime, player_number, my_number; HWND hwnd=GetForegroundWindow(); const int blue=0,yellow=1,red=2,green=3,purple=4,white=5;//颜色常量 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; } } int idx_police=-1; void gotoxy(int x,int y){ COORD position; position.X=x; position.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position); } void init_Show_Window(){ system("mode con lines=60 cols=188"); ShowWindow(hwnd,SW_MAXIMIZE);//窗口最大化 DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND); DrawMenuBar(GetConsoleWindow());//删除×字符 }
/玩家类/ const int nvwu=0,cunmin=1,yuyanjia=2,langren=3,lieren=4,shouwei=5,good=6,die=1,life=2; class player{ public: int type; int die_or_life; int how(){ return die_or_life; } int is_light;//是否已经公布 int killer; }; player players[1000];
/转换白天模式/ void change_daytime(){ during_time=daytime; day++; }
/转换黑夜模式/ void change_night(){ during_time=night; } int nnvwu=0,ncunmin=0,nyuyanjia=0,nlangren=0,nlieren=0,nshouwei=0; int idxnvwu,idxshouwei,idxyuyanjia,idxlieren,idxlangren[4]={-1,-1,-1,-1};
/b是否在Arr中/ bool is_include(int arr[],int b,int l){ for(int i=0;i<l;i++){ if(arr[i]==b) return true; } return false; }
/初始化人数/
void init_players(){
my_number=rand()%player_number;
if(player_number12) nlangren=4;
else if(player_number>=10) nlangren=3;
else nlangren=2;
for(int i=0;i<player_number;i++)
{
players[i].die_or_life=life;
players[i].is_light=0;
players[i].type=-1;
players[i].killer=2147483647;
}
for(int i=0;i<nlangren;i++)
{
int p=rand()%player_number;
if(!is_include(idxlangren,p,4))
idxlangren[i]=p,players[p].type=langren;
else
i--;
Sleep(rand()%80+100);
}
if(player_number12)
{
do{
idxshouwei=rand()%player_number;
}while(players[idxshouwei].type!=-1);
players[idxshouwei].type=shouwei;
}
do{
idxnvwu=rand()%player_number;
}while(players[idxnvwu].type!=-1);
players[idxnvwu].type=nvwu;
if(player_number>=10)
{
do{
idxlieren=rand()%player_number;
}while(players[idxlieren].type!=-1);
players[idxlieren].type=lieren;
}
do{
idxyuyanjia=rand()%player_number;
}while(players[idxyuyanjia].type!=-1);
players[idxyuyanjia].type=yuyanjia;
for(int i=0;i<player_number;i++)
if(players[i].type==-1)
players[i].type=cunmin,
ncunmin++;
if(players[my_number].type==langren)
{
for(int i=0;i<nlangren;i++)
{
players[idxlangren[i]].is_light=1;
}
}
players[my_number].is_light=1;
}
/在屏幕上打印东西/ void print(){ gotoxy(0,0); cout<<"作者:666"; gotoxy(90,0); if(during_timenight) color(red); else color(blue); printf("第%d天 | ",day); if(during_timenight) cout<<"黑夜"; else cout<<"白天";
gotoxy(0,3);
color(blue);
cout<<" 我的号位:"<<my_number+1;
for(int i=0;i<player_number;i++){
gotoxy(i*8+1,4);
if(i==idx_police) color(yellow);
else color(blue);
cout<<i+1<<"号位";
gotoxy(i*8+1,5);
if(players[i].how()==die){
color(red);
cout<<"死 亡";
}else{
color(green);
cout<<"存 活";
}
gotoxy(i*8+1,6);
color(blue);
if(players[i].is_light){
if(players[i].is_light==1){
switch(players[i].type){
case cunmin: cout<<"普通蛋";break;
case langren:cout<<"科学怪蛋"; break;
}
}else{
cout<<"普通蛋";
}
}else{
cout<<"未知";
}
}
}
/判断是否结束,没结束返回0 普通蛋胜利返回1 科学怪蛋胜利返回2 平局返回3/ int is_end(){ int die_bad=0; int die_people=0; int die_god=0; for(int i=0;i<player_number;i++){ if((players[i].type == nvwu || players[i].type == yuyanjia || players[i].type == shouwei)&&players[i].die_or_lifedie) die_god++; else if(players[i].type == langren && players[i].die_or_lifedie) die_bad++; else if(players[i].type == cunmin && players[i].die_or_lifedie) die_people++; } if((die_baddie_people || die_bad==die_god)&&(die_bad>=nlangren)) return 3; if(die_bad>=nlangren) return 1; if(die_people>=ncunmin||die_god>=(player_number>=10 ? 3:2)) return 2; return 0; }
/游戏开始前的骚操作/
void before_game(){
srand(time(NULL));
init_Show_Window();
color(green);
cout<<"欢迎来到科学怪蛋游戏\t\t\t为了更好的游戏体验,请右键点击上方↑↑,点击"属性",点击"字体"栏目,将字体修改为宋体或新宋体,将字号改为20\n作者:洛谷393864\n请勿私自转载,违者依法追究法律责任 注:10 11 12人局开设猎人 12人局开设守卫警长\n______________________\n";
cout<<"请输入玩家人数(8-12人):";
cin>>player_number;
while(player_number<8||player_number>12)
{ cout<<"请重新输入!\n"; cin>>player_number; }
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_number+1<<endl
<<"我的身份:";
switch(players[my_number].type){
case nvwu: cout<<"女巫\n";break;
case yuyanjia: cout<<"预言家\n";break;
case cunmin: cout<<"村民\n";break;
case langren:cout<<"狼人\n";break;
case lieren:cout<<"猎人\n"; break;
case shouwei:cout<<"守卫\n";break;
}
change_daytime();
system("pause");
system("cls");
cout<<"游戏加载中.";int ppppp=rand()%3+2;
for(int i=0;i<ppppp;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();
}
/每一天开始前的操作/ void something_before_everyday(){ change_night(); system("cls"); print(); gotoxy(0,7); cout<<"________________________"; gotoxy(0,8); color(white); cout<<"天黑~请闭眼~~~\n"; }
/狼人操作/ int LangRen(){ int langrensha=-1; color(red); cout<<"科学怪蛋请睁眼~~~\n"; Sleep(1500); cout<<"你们今晚要杀~谁~~??\n"; if(players[my_number].typelangren&&players[my_number].die_or_life == life){ cin>>langrensha; while(!(langrensha>=1&&langrensha<=player_number&&players[langrensha-1].die_or_lifelife)){ cout<<"请重新输入!\n"; cin>>langrensha; } cout<<"你们今晚要杀的是"<<langrensha--<<"号\n"; Sleep(3500); }else{ while(langrensha==-1 || players[langrensha].die_or_life == die || players[langrensha].type==langren){ langrensha=rand()%player_number; } Sleep(3000); } cout<<"科学怪蛋请~闭眼~~\n\n"; return langrensha; }
/黑夜操作/
int LANGRENSHA=-1,NVWUDU=-1,NVWUJIU=-1,SHOUWEISHOU=-1;
void Night(){
LANGRENSHA=-1,NVWUDU=-1,NVWUJIU=-1,SHOUWEISHOU=-1;
/*狼人部分*/
LANGRENSHA=LangRen();
Sleep(3500);
void police_die();
/判断谁死了/
void panduansiwang(){
system("cls");
print();
gotoxy(0,7);
cout<<"________________________\n";
Sleep(3000);
color(white);
cout<<"天亮了\n";
Sleep(2000);
gotoxy(0,9);
cout<<"昨晚";
bool is_die[15]={false},is_die_lieren=false,flag=false;
for(int i=0;i<player_number;i++)
{
if(players[i].die_or_lifelife)
{
if(iLANGRENSHA||iNVWUDU) {
if(players[i].typelieren) is_die_lieren=true;
players[i].killer= (iLANGRENSHA ? langren:nvwu);
players[i].die_or_life=die;
is_die[i]=true;
}
if(iSHOUWEISHOU||iNVWUJIU) {
if(players[i].typelieren) is_die_lieren=false;
players[i].killer=-1;
players[i].die_or_life=life;
is_die[i]=false;
}
}
}
bool is_police_die=false;
for(int i=0;i<player_number;i++)
{
if(is_die[i])
{
if(flag) cout<<"和"<<i+1<<"号";
else cout<<i+1<<"号",flag=true;
if(i==idx_police)
is_police_die=true;
}
}
if(flag) cout<<"死了\n";
else cout<<"是平安夜\n";
if(is_die_lieren) Lieren();
if(is_police_die) police_die();
}
/选警长/ void choose_police(){ system("cls"); print(); color(blue); gotoxy(0,7); cout<<"________________________\n"; color(yellow); cout<<"下面开始选举警长,各位不能选举自己~\n"; int tong[100]={0},cannot[100],must[100]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; memset(cannot,-1,sizeof(cannot)); CHOOSE: color(yellow); Sleep(1500); for(int i=0;i<player_number;i++) { if(players[i].die_or_lifelife&&!is_include(cannot,i,player_number)) { if(imy_number) { cout<<"你要选举几号?\n"; int n; cin>>n; while(n<1||n>player_number||ni+1||players[n-1].die_or_lifedie||!is_include(must,n-1,player_number)) { cout<<"请重新输入!\n"; cin>>n; } cout<<i+1<<"号选举"<<n--<<"号\n"; tong[n]++; } else { int n=rand()%player_number; while(ni||players[n].die_or_lifedie||!is_include(must,n,player_number)) n=rand()%player_number; cout<<i+1<<"号选举"<<n+1<<"号\n"; tong[n]++; } Sleep(1500); } } int idx_max=-1,maxn=-1,len=0; for(int i=0;i<player_number;i++) if(maxn<tong[i]) { maxn=tong[i]; idx_max=i; } int maxn_arr[15]={0}; for(int i=0;i<player_number;i++) { if(tong[i]maxn) { maxn_arr[len++]=i; } } color(blue); if(len>1) { for(int i=0;i<len;i++) { if(ilen-1) { cout<<maxn_arr[i]+1<<"号平票\n"; } else { cout<<maxn_arr[i]+1<<"号,"; } } for(int i=0;i<len;i++) cannot[i]=maxn_arr[i]; for(int i=0;i<player_number;i++) { if(is_include(cannot,i,len)) must[i]=i; else must[i]=-1; } color(white); goto CHOOSE; } cout<<"恭喜"<<idx_max+1<<"号当选警长\n"; Sleep(3000); idx_police=idx_max; return; }
/投票/
int toupiao(){
int tong[100]={0},cannot[100]={},must[100]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
memset(cannot,-1,sizeof(cannot));
gotoxy(0,7);
color(blue);
cout<<"________________________\n";
color(white);
cout<<"下面进入投票环节\n";
memset(tong,0,sizeof(tong));
Sleep(2000);
TOUPIAO:
for(int i=0;i<player_number;i++){
if(players[i].die_or_life == life&&!is_include(cannot,i,player_number)){
if(imy_number){
color(white);
cout<<"你要投几号?\n";
int n;
cin>>n;
while(!(n>=1&&n<=player_number&&is_include(must,n-1,player_number))){
cout<<"请重新输入!\n";
cin>>n;
}
Sleep(2000);
cout<<setw(2)<<my_number+1<<"号投了"<<setw(2)<<n<<"号";
if(my_numbern-1) color(red),cout<<"快来看!这有个疯子投自己!";
if(iidx_police) color(yellow),cout<<"(警长)\n"; else cout<<"\n";
if(iidx_police) tong[n-1]++;
tong[n-1]++;
}else{
color(white);
int t=-1;
while(t==-1 || players[t].die_or_life == die || ti || !is_include(must,t,player_number)){
if(iidxyuyanjia&&yuyanjiabixutoupiao!=-1)
{
t=yuyanjiabixutoupiao;
yuyanjiabixutoupiao=-1;
continue;
}
t=rand()%player_number;
if(is_include(idxlangren,i,nlangren))
{
if(players[t].type == langren)
t=-1;
}
}
cout<<setw(2)<<i+1<<"号"<<"投了"<<setw(2)<<t+1<<"号";
if(iidx_police) cout<<"(警长2票)\n"; else cout<<"\n";
if(iidx_police) tong[t]++;
tong[t]++;
}
Sleep(rand()%1000+1000);
}
}
int idx_max=-1,maxn=-1,len=0;
for(int i=0;i<player_number;i++)
if(maxn<tong[i])
{
maxn=tong[i];
idx_max=i;
}
int maxn_arr[15]={0};
for(int i=0;i<player_number;i++)
{
if(tong[i]==maxn)
{
maxn_arr[len++]=i;
}
}
color(blue);
if(len>1)
{
for(int i=0;i<len;i++)
{
if(i==len-1)
{
cout<<maxn_arr[i]+1<<"号平票\n";
}
else
{
cout<<maxn_arr[i]+1<<"号,";
}
}
for(int i=0;i<len;i++)
cannot[i]=maxn_arr[i];
for(int i=0;i<player_number;i++)
{
if(is_include(cannot,i,len))
must[i]=i;
else
must[i]=-1;
}
color(white);
goto TOUPIAO;
}
cout<<idx_max+1<<"号"<<"出局\n";
Sleep(4000);
players[idx_max].die_or_life = die;
players[idx_max].killer = good;
return idx_max;
}
/警长死亡/ void police_die(){ color(yellow); int type; if(idx_police==my_number) { Sleep(1550); cout<<"你是想撕毁警徽还是移交警徽?(撕毁输入1,移交输入2)";
cin>>type;
while(!(type==1||type==2))
{
cout<<"请重新输入!\n";
cin>>type;
}
}
else{
type=rand()%3+1;
}
if(type==1)
{
cout<<"警长选择撕毁警徽\n";
Sleep(1000);
idx_police=-1;
}
else
{
int lucky=-1;
while(lucky==-1||players[lucky].die_or_life==die)
lucky=rand()%player_number;
cout<<"警长选择把警徽移交给"<<lucky+1<<"号\n";
Sleep(1500);
idx_police=lucky;
}
}
/故事的最后/ void the_end(){ system("cls"); switch(is_end()){ case 1:cout<<"普通蛋胜利\n\n"; break; case 2:cout<<"科学怪蛋胜利\n\n"; break; case 3:cout<<"本局平局\n\n"; break; } for(int i=0;i<player_number;i++){ cout<<i+1<<"号位:\t"; switch(players[i].type){ case nvwu: cout<<"科学怪蛋";break;
case shouwei:cout<<"普通蛋\t";break;
}
cout<<"最终";
switch(players[i].killer){
case langren:cout<<"被科学怪蛋杀死\n"; break;
case good:cout<<"被投票出局\n"; break;
default :cout<<"存活\n";
}
cout<<endl;
}
}
/主函数/ int main(){ int wheel=0; before_game(); while(!is_end()){ //黑夜准备 something_before_everyday(); Sleep(1500);
//黑夜部分
Night(); //进入黑夜!
change_daytime(); //换天
//天亮了
panduansiwang();//判断谁死了
Sleep(2000);
system("cls");
print();
if(is_end()) break;
//选警长
if(!wheel&&player_number==12)
{
choose_police();
system("cls");
print();
}
//投票环节
int idx_max=toupiao();//票数最多的人
if(idx_max==idx_police){
police_die();
}
if(players[idx_max].type==lieren){//启动猎人程序
Lieren();
if(is_end()) break;
}
system("cls");
print();
wheel++;
}
the_end();
system("pause");
return 0;
}
0 条评论
信息
- ID
- 143
- 时间
- ms
- 内存
- MiB
- 难度
- 6
- 标签
- 递交数
- 70
- 已通过
- 21
- 上传者