#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,baisha=2,langren=3,lieren=4,shouwei=5,good=6,die=1,life=2;
const int baichi=7,bomb=8,langwu=9,langwang=10;

class player{
public:
	int type;
	int die_or_life;
	int how(){ return die_or_life; }
	int is_light;
	int killer;
	int can_vote;
};
player players[1000];

/*=================== 全局状态 ===================*/
int nnvwu=0,ncunmin=0,nlangren=0,nlieren=0,nshouwei=0;
int idxnvwu=-1,idxshouwei=-1,idxbaisha=-1,idxlieren=-1;
int idxbaichi=-1,idxbomb=-1,idxlangwu=-1,idxlangwang=-1;
int idxlangren[6]={-1,-1,-1,-1,-1,-1};
bool bomb_win=false;
bool langwang_used=false;
int total_god=0;
int total_wolf=0;
int total_people=0;

/*=================== 黑夜全局变量(提前声明) ===================*/
int LANGRENSHA=-1,NVWUDU=-1,NVWUJIU=-1,SHOUWEISHOU=-1;

void change_daytime(){ during_time=daytime; day++; }
void change_night(){ during_time=night; }

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_number==12) 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;
		players[i].can_vote=1;
	}

	// 狼人
	for(int i=0;i<nlangren;i++){
		int p=rand()%player_number;
		if(!is_include(idxlangren,p,6))
			idxlangren[i]=p, players[p].type=langren;
		else i--;
		Sleep(rand()%40+50);
	}

	// 1. 中立:炸弹人必出
	int pBomb;
	do{ pBomb=rand()%player_number; }while(players[pBomb].type!=-1);
	players[pBomb].type=bomb;
	idxbomb=pBomb;

	// 2. 好人神职:女巫必出 + 从 {白莎,白痴,守卫(12人),猎人(>=10人)} 随机 3 个
	vector<int> godPool;
	godPool.push_back(baisha);
	godPool.push_back(baichi);
	if(player_number==12) godPool.push_back(shouwei);
	if(player_number>=10) godPool.push_back(lieren);
	random_shuffle(godPool.begin(), godPool.end());

	vector<int> gods;
	gods.push_back(nvwu);
	for(size_t i=0;i<godPool.size() && gods.size()<4;i++)
		gods.push_back(godPool[i]);

	// 3. 狼人神职:有白莎 → 狼巫;无白莎 → 狼王
	bool hasBaisha=false;
	for(size_t i=0;i<gods.size();i++) if(gods[i]==baisha) hasBaisha=true;
	int wolfGod = hasBaisha ? langwu : langwang;

	// 4. 放置狼神
	{
		int p;
		do{ p=rand()%player_number; }while(players[p].type!=-1);
		players[p].type=wolfGod;
		if(wolfGod==langwu) idxlangwu=p; else idxlangwang=p;
	}
	// 5. 放置好人神职
	for(size_t i=0;i<gods.size();i++){
		int p;
		do{ p=rand()%player_number; }while(players[p].type!=-1);
		players[p].type=gods[i];
		switch(gods[i]){
			case nvwu: idxnvwu=p; break;
			case baisha: idxbaisha=p; break;
			case baichi: idxbaichi=p; break;
			case shouwei: idxshouwei=p; break;
			case lieren: idxlieren=p; break;
		}
	}
	// 6. 剩下都是平民
	for(int i=0;i<player_number;i++)
		if(players[i].type==-1) players[i].type=cunmin, ncunmin++;

	// 统计
	total_god=0; total_wolf=0; total_people=ncunmin;
	for(int i=0;i<player_number;i++){
		int t=players[i].type;
		if(t==nvwu||t==baisha||t==shouwei||t==lieren||t==baichi) total_god++;
		else if(t==langren||t==langwu||t==langwang) total_wolf++;
	}

	// 狼人队友可见
	if(players[my_number].type==langren){
		for(int i=0;i<nlangren;i++) players[idxlangren[i]].is_light=1;
	}
	if(players[my_number].type==langwu || players[my_number].type==langwang)
		players[my_number].is_light=1;
	players[my_number].is_light=1;
}

/*=================== 打印 ===================*/
const char* typeName(int t){
	switch(t){
		case nvwu: return "女 巫";
		case baisha: return "\b白 莎";
		case cunmin: return "村 民";
		case langren: return "狼 人";
		case lieren: return "猎 人";
		case shouwei: return "守 卫";
		case baichi: return "白 痴";
		case bomb: return "炸 弹";
		case langwu: return "狼 巫";
		case langwang: return "狼 王";
	}
	return "???";
}
void print(){
	gotoxy(0,0);
	cout<<"作者:洛谷393864";
	gotoxy(90,0);
	color(during_time==night?red:blue);
	printf("第%d天 | ",day);
	cout<<(during_time==night?"黑夜":"白天");

	gotoxy(0,3);
	color(blue);
	cout<<" 我的号位:"<<my_number+1;
	for(int i=0;i<player_number;i++){
		gotoxy(i*8+1,4);
		color(i==idx_police?yellow: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) cout<<typeName(players[i].type);
			else cout<<"好人";
		}else cout<<"未知";
	}
}

/*=================== 判断结束 ===================*/
int is_end(){
	if(bomb_win) return 4;

	int die_bad=0,die_people=0,die_god=0;
	for(int i=0;i<player_number;i++){
		if(players[i].die_or_life!=die) continue;
		int t=players[i].type;
		if(t==nvwu||t==baisha||t==shouwei||t==lieren||t==baichi) die_god++;
		else if(t==langren||t==langwu||t==langwang) die_bad++;
		else if(t==cunmin) die_people++;
	}
	if(die_bad>=total_wolf) return 1;
	if(die_people>=total_people || die_god>=total_god) return 2;
	int aliveBad=total_wolf-die_bad;
	int aliveGood=(total_god-die_god)+(total_people-die_people);
	if(aliveBad==0 && aliveGood==0) return 3;
	return 0;
}

/*=================== 游戏开始前 ===================*/
void before_game(){
	srand(time(NULL));
	init_Show_Window();
	color(green);
	cout<<"欢迎来到狼人杀游戏\n作者:洛谷393864\n";
	cout<<"规则:\n";
	cout<<"  平民阵营必出4神职;狼人阵营仅1位神职(有白莎→狼巫,无白莎→狼王);\n";
	cout<<"  炸弹人为中立阵营,每把必出,被投出时炸弹人独自胜利!\n";
	cout<<"  白莎:查验狼人时狼人直接死亡(受守卫/女巫保护无效)\n";
	cout<<"  白痴:被投出时翻牌存活,失去投票权,不能再被投出\n";
	cout<<"  狼巫:每晚查看一名平民的具体身份,查到白莎时白莎直接死亡\n";
	cout<<"  狼王:死亡时白天带走一人(被毒杀除外)\n";
	cout<<"______________________\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 baisha: cout<<"白莎\n";break;
		case cunmin: cout<<"村民\n";break;
		case langren:cout<<"狼人\n";break;
		case lieren:cout<<"猎人\n";break;
		case shouwei:cout<<"守卫\n";break;
		case baichi:cout<<"白痴\n";break;
		case bomb:cout<<"炸弹人(中立)\n";break;
		case langwu:cout<<"狼巫\n";break;
		case langwang: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 shouweishou=0;
int ShouWei(){
	color(blue);
	cout<<"守卫~请睁眼~~\n";
	Sleep(1500);
	cout<<"你要守护的是?\n";
	if(players[my_number].type==shouwei&&players[my_number].die_or_life==life){
		cin>>shouweishou;
		while(!(shouweishou>=1&&shouweishou<=player_number&&players[shouweishou-1].die_or_life==life)){
			cout<<"请重新输入!\n"; cin>>shouweishou;
		}
		cout<<"你今晚要守护的是"<<shouweishou<<"号\n";
		Sleep(1500);
		shouweishou--;
	}else{
		if(idxshouwei!=-1 && players[idxshouwei].die_or_life==life){
			shouweishou=rand()%player_number;
			while(!(shouweishou>=0&&shouweishou<player_number&&players[shouweishou].die_or_life==life))
				shouweishou=rand()%player_number;
		}
	}
	Sleep(2000);
	cout<<"守卫请闭眼"<<endl<<endl;
	return shouweishou;
}

/*=================== 狼人 ===================*/
int LangRen(){
	int langrensha=-1;
	color(red);
	cout<<"狼人~请睁眼~~~\n";
	Sleep(1500);
	cout<<"你们今晚要杀~谁~~??\n";
	if(players[my_number].type==langren&&players[my_number].die_or_life==life){
		cin>>langrensha;
		while(!(langrensha>=1&&langrensha<=player_number&&players[langrensha-1].die_or_life==life)){
			cout<<"请重新输入!\n"; cin>>langrensha;
		}
		cout<<"你们今晚要杀的是"<<langrensha--<<"号\n";
		Sleep(3500);
	}else{
		while(langrensha==-1 || players[langrensha].die_or_life==die || players[langrensha].type==langren
			|| players[langrensha].type==langwu || players[langrensha].type==langwang){
			langrensha=rand()%player_number;
		}
		Sleep(3000);
	}
	cout<<"狼人请~闭眼~~\n\n";
	return langrensha;
}

/*=================== 狼巫 ===================*/
void LangWu(){
	if(idxlangwu==-1) return;
	if(players[idxlangwu].die_or_life!=life) return;
	color(red);
	cout<<"狼巫~请睁眼~~\n";
	Sleep(1500);
	int p;
	if(players[my_number].type==langwu && players[my_number].die_or_life==life){
		cout<<"你想查看谁的身份?\n";
		cin>>p;
		while(!(p>=1&&p<=player_number&&players[p-1].die_or_life==life)){
			cout<<"请重新输入!\n"; cin>>p;
		}
		p--;
	}else{
		do{ p=rand()%player_number; }
		while(players[p].die_or_life==die || players[p].type==langren
			|| players[p].type==langwu || players[p].type==langwang);
	}
	cout<<p+1<<"号的身份是: ";
	Sleep(1000);
	cout<<typeName(players[p].type)<<"\n";
	players[p].is_light=1;
	if(players[p].type==baisha){
		Sleep(1000);
		if(p==SHOUWEISHOU || p==NVWUJIU){
			cout<<"但是白莎被守护/女巫救了,没有死亡\n";
		}else{
			cout<<"狼巫之力发动!白莎直接死亡!\n";
			players[p].die_or_life=die;
			players[p].killer=langwu;
		}
	}
	Sleep(2000);
	cout<<"狼巫~请闭眼~~\n\n";
}

/*=================== 女巫 ===================*/
int nvwujiu=0,nvwudu=0,is_nvwujiu=0,is_nvwudu=0;
int NvWu(int langrensha){
	if(idxnvwu==-1) return -1;
	color(purple);
	cout<<"女巫~~请睁眼~~\n";
	Sleep(2000);
	if(players[my_number].type==nvwu&&players[my_number].die_or_life==life){
		if(is_nvwujiu) cout<<"你已经用过解药\n",Sleep(1500);
		else{
			cout<<"今晚"<<langrensha+1<<"号死了,你想用解药吗?(1想 / 2不想)\n";
			int x=0; cin>>x;
			while(x!=1&&x!=2){ cout<<"请重新输入\n"; cin>>x; }
			if(x==1){ Sleep(1000); cout<<"已经解救"<<langrensha+1<<"号\n"; nvwujiu=langrensha; }
			is_nvwujiu=1;
		}
		Sleep(1500);
		if(::is_nvwudu) cout<<"你已经用过毒药\n",Sleep(1500);
		else{
			cout<<"你想用毒药吗?(1想 / 2不想)\n";
			Sleep(1500);
			int x=0; cin>>x;
			while(x!=1&&x!=2){ cout<<"请重新输入\n"; cin>>x; }
			if(x==1){
				Sleep(1500);
				cout<<"你想毒谁?\n";
				cin>>nvwudu;
				while(!(nvwudu>=1&&nvwudu<=player_number&&players[nvwudu].die_or_life==life)){
					cout<<"请重新输入\n"; cin>>nvwudu;
				}
				nvwudu--;
				Sleep(1500);
				cout<<"已经毒死了"<<nvwudu+1<<"号\n";
			}
			::is_nvwudu=1;
		}
	}else{
		if(players[idxnvwu].die_or_life==life){
			if(!is_nvwujiu){
				if(rand()%8==0){ nvwujiu=langrensha; is_nvwujiu=1; }
			}
			if(!is_nvwudu){
				if(rand()%4==0){ nvwudu=rand()%player_number; is_nvwudu=1; }
			}
		}
	}
	cout<<"女巫~请闭眼~~\n\n";
	return nvwujiu*10000+nvwudu;
}

/*=================== 白莎 ===================*/
int baishabixutoupiao=-1;
void BaiSha(){
	if(idxbaisha==-1) return;
	color(green);
	cout<<"白莎~请睁眼~~\n";
	Sleep(2000);
	if(players[my_number].type==baisha && players[my_number].die_or_life==life){
		cout<<"请问你想查验谁的身份\n";
		int p; cin>>p;
		while(!(p>=1&&p<=player_number)){ cout<<"请重新输入!\n"; cin>>p; }
		Sleep(2000);
		cout<<p<<"号的身份是——";
		Sleep(1000);
		if(players[p-1].type==langren||players[p-1].type==langwu||players[p-1].type==langwang){
			cout<<"狼人\n";
			players[p-1].is_light=1;
			Sleep(1000);
			if(p-1==SHOUWEISHOU || p-1==NVWUJIU){
				cout<<"但是被守护/女巫救了,没有死亡\n";
			}else{
				cout<<"白莎之力发动!"<<p<<"号狼人直接死亡!\n";
				players[p-1].die_or_life=die;
				players[p-1].killer=baisha;
			}
		}else{
			cout<<"好人\n";
			players[p-1].is_light=2;
		}
	}else{
		int p=-1;
		while(p==-1||players[p].die_or_life==die||p==idxlieren) p=rand()%player_number;
		if(players[p].type==langren||players[p].type==langwu||players[p].type==langwang){
			baishabixutoupiao=p;
			if(!(p==SHOUWEISHOU || p==NVWUJIU)){
				players[p].die_or_life=die;
				players[p].killer=baisha;
			}
		}
	}
	cout<<"白莎~~请闭眼~~\n";
}

/*=================== 黑夜 ===================*/
void Night(){
	LANGRENSHA=-1; NVWUDU=-1; NVWUJIU=-1; SHOUWEISHOU=-1;
	if(idxshouwei!=-1){
		SHOUWEISHOU=ShouWei();
		Sleep(2000);
	}
	LANGRENSHA=LangRen();
	Sleep(3500);
	LangWu();
	Sleep(2000);
	int nvwu=NvWu(LANGRENSHA);
	NVWUDU=nvwu%10+nvwu/10%10;
	NVWUJIU=nvwu/10000%10+nvwu/100000%10;
	Sleep(3000);
	BaiSha();
	Sleep(2000);
}

/*=================== 猎人 ===================*/
void Lieren(){
	if(idxlieren==-1) return;
	cout<<idxlieren+1<<"号是猎人\n";
	players[idxlieren].is_light=1;
	Sleep(1000);
	int lierendai=-1;
	if(idxlieren==my_number){
		cout<<"你想带走几号?\n";
		cin>>lierendai;
		while(lierendai<1||lierendai>player_number||players[lierendai-1].die_or_life==die){
			cout<<"请重新输入!\n"; cin>>lierendai;
		}
		lierendai--;
	}else{
		lierendai=rand()%player_number;
		while(players[lierendai].die_or_life==die) lierendai=rand()%player_number;
	}
	Sleep(2000);
	cout<<"猎人选择带走"<<lierendai+1<<"号\n";
	Sleep(2000);
	players[lierendai].die_or_life=die;
	players[lierendai].killer=lieren;
}

/*=================== 狼王 ===================*/
void LangWang(){
	if(idxlangwang==-1) return;
	if(langwang_used) return;
	langwang_used=true;
	cout<<idxlangwang+1<<"号是狼王\n";
	players[idxlangwang].is_light=1;
	Sleep(1000);
	int t=-1;
	if(idxlangwang==my_number){
		cout<<"你想带走几号?\n";
		cin>>t;
		while(t<1||t>player_number||players[t-1].die_or_life==die){
			cout<<"请重新输入!\n"; cin>>t;
		}
		t--;
	}else{
		t=rand()%player_number;
		while(players[t].die_or_life==die) t=rand()%player_number;
	}
	Sleep(2000);
	cout<<"狼王选择带走"<<t+1<<"号\n";
	Sleep(2000);
	players[t].die_or_life=die;
	players[t].killer=langwang;
}

/*=================== 天亮结算 ===================*/
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[20]={false}, is_die_lieren=false, is_die_langwang=false, flag=false;

	for(int i=0;i<player_number;i++){
		if(players[i].die_or_life==life){
			if(i==LANGRENSHA||i==NVWUDU){
				if(i==NVWUJIU) continue;
				if(i==SHOUWEISHOU) continue;
				players[i].killer = (i==LANGRENSHA?langren:nvwu);
				players[i].die_or_life=die;
				is_die[i]=true;
			}
		}
	}
	for(int i=0;i<player_number;i++){
		if(players[i].die_or_life==die && (players[i].killer==baisha || players[i].killer==langwu)){
			if(i==SHOUWEISHOU || i==NVWUJIU){
				players[i].die_or_life=life;
				players[i].killer=2147483647;
			}else{
				is_die[i]=true;
			}
		}
	}
	for(int i=0;i<player_number;i++){
		if(is_die[i]||players[i].die_or_life==die){
			if(players[i].type==lieren && is_die[i]) is_die_lieren=true;
			if(players[i].type==langwang && is_die[i] && players[i].killer!=nvwu) is_die_langwang=true;
		}
	}
	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_die_langwang) LangWang();
	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_life==life&&!is_include(cannot,i,player_number)){
			if(i==my_number){
				cout<<"你要选举几号?\n";
				int n; cin>>n;
				while(n<1||n>player_number||n==i+1||players[n-1].die_or_life==die||!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(n==i||players[n].die_or_life==die||!is_include(must,n,player_number))
					n=rand()%player_number;
				cout<<i+1<<"号选举"<<n+1<<"号\n";
				tong[n]++;
			}
			Sleep(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 CHOOSE;
	}
	cout<<"恭喜"<<idx_max+1<<"号当选警长\n";
	Sleep(3000);
	idx_police=idx_max;
}

/*=================== 投票 ===================*/
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 && players[i].can_vote && !is_include(cannot,i,player_number)){
			if(i==my_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_number==n-1) color(red),cout<<"快来看!这有个疯子投自己!";
				if(i==idx_police) color(yellow),cout<<"(警长)\n"; else cout<<"\n";
				if(i==idx_police) tong[n-1]++;
				tong[n-1]++;
			}else{
				color(white);
				int t=-1;
				while(t==-1 || players[t].die_or_life==die || t==i || !is_include(must,t,player_number)){
					if(i==idxbaisha && baishabixutoupiao!=-1){
						t=baishabixutoupiao; baishabixutoupiao=-1; continue;
					}
					t=rand()%player_number;
					if(is_include(idxlangren,i,nlangren) && (players[t].type==langren||players[t].type==langwu||players[t].type==langwang))
						t=-1;
				}
				cout<<setw(2)<<i+1<<"号"<<"投了"<<setw(2)<<t+1<<"号";
				if(i==idx_police) cout<<"(警长2票)\n"; else cout<<"\n";
				if(i==idx_police) tong[t]++;
				tong[t]++;
			}
			Sleep(rand()%800+800);
		}
	}
	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(2000);

	if(players[idx_max].type==bomb){
		players[idx_max].die_or_life=die;
		players[idx_max].killer=good;
		bomb_win=true;
		Sleep(2000);
		cout<<"\n炸弹人被投出!炸弹人独自胜利!\n";
		return idx_max;
	}
	if(players[idx_max].type==baichi){
		players[idx_max].is_light=1;
		players[idx_max].can_vote=0;
		Sleep(2000);
		cout<<"\n白痴翻牌!白痴存活,但失去投票权,不能再被投出!\n";
		Sleep(2000);
		return idx_max;
	}

	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;
		case 4:cout<<"炸弹人独自胜利!\n\n"; break;
	}
	for(int i=0;i<player_number;i++){
		cout<<i+1<<"号位:\t";
		switch(players[i].type){
			case nvwu: cout<<"女巫\t";break;
			case baisha: cout<<"白莎\t";break;
			case cunmin: cout<<"村民\t";break;
			case langren:cout<<"狼人\t";break;
			case lieren:cout<<"猎人\t";break;
			case shouwei:cout<<"守卫\t";break;
			case baichi:cout<<"白痴\t";break;
			case bomb:cout<<"炸弹人\t";break;
			case langwu:cout<<"狼巫\t";break;
			case langwang:cout<<"狼王\t";break;
		}
		cout<<"最终";
		switch(players[i].killer){
			case nvwu:cout<<"被女巫毒死\n"; break;
			case langren:cout<<"被狼人杀死\n"; break;
			case good:cout<<"被投票出局\n"; break;
			case lieren:cout<<"被猎人带走\n";break;
			case baisha:cout<<"被白莎查验死亡\n";break;
			case langwu:cout<<"被狼巫查验死亡\n";break;
			case langwang: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(is_end()){ system("cls"); break; }
		if(idx_max==idx_police && players[idx_police].die_or_life==die){
			police_die();
		}
		if(players[idx_max].die_or_life==die && players[idx_max].type==lieren){
			Lieren();
			if(is_end()) break;
		}
		system("cls");
		print();
		wheel++;
	}
	the_end();
	system("pause");
	return 0;
}