欣慰的死了
查看原帖
欣慰的死了
836448
stylus楼主2024/6/29 23:00

rt

#include<bits/stdc++.h>
using namespace std;
struct pig{string name,s;int b,p,nt,lt;bool mp,zp;}a[11];
int n,m,fb,hp,fd;
string __;
//print()&x_y()用来检查。
void print(){//输出战局。
	cout<<"目前局势:\n";
	for(int i=0;i<n;i++){
		cout<<a[i].name<<' '<<a[i].b<<' ';
		if(a[i].b<1)cout<<"DEAD\n";
		else{
			for(int j=0;j<a[i].s.size();j++)cout<<a[i].s[j];
			cout<<endl;
		}
	}cout<<"牌堆:";
	for(int i=0;i<__.size();i++)cout<<__[i];
	cout<<endl;
	return;
}
void x_y(int x,int y,string z){//x对y使用了z。
	cout<<x<<a[x].name<<"对"<<y<<a[y].name<<"使用了:"<<z<<endl;
	print();
	return;
}
void pc(int x,int i){//摸牌。
	while(i--){
		a[x].s+=__.substr(0,2);
		if(__.size()-2)__.erase(0,2);
	}return;
}
void P(int x){//桃。
	int i=a[x].s.find("P ");
	while(i<a[x].s.size()&&a[x].b<4)a[x].s.erase(i,2),a[x].b++,i=a[x].s.find("P ");
	return;
}
bool die(int x,int y){//死了?
	if(a[y].b>0)return 0;
	P(y);
	if(a[y].b>0)return 0;
	a[a[y].lt].nt=a[y].nt,a[a[y].nt].lt=a[y].lt,hp--;
	if(a[y].name=="FP")pc(x,3),fd++;
	else if(a[x].name=="MP"&&a[y].name=="ZP")a[x].s.erase(0);
	return 1;
}
int D(int x){//闪。
	int i=a[x].s.find("D ");
	if(i>=a[x].s.size())return 1;
	a[x].s.erase(i,2);
	return 0;
}
bool K(int x){//出杀。
	int i=a[x].s.find("K ");
	if(i>=a[x].s.size())return 1;
	a[x].s.erase(i,2);
	return 0;
}
void K_p(int x,int y){//杀人。
	while(!K(x)){
		a[y].b-=D(y);
		if(!y)a[y].mp=1;
		if(die(x,y))return;
		if(!a[x].zp)break;
	}return;
}
bool J(int x){//无懈可击。
	int i=a[x].s.find("J ");
	if(i>=a[x].s.size())return 0;
	a[x].s.erase(i,2);
	return 1;
}
bool ok(int x){//献殷勤。
	if(a[x].p==-1)return 0;
	if(!a[x].p){
		for(int i=0,j=0;j<hp;j++,i=a[i].nt){
			if(a[i].name=="FP"&&J(i)){
				a[i].p=0;
				return 1;
			}
		}return 0;
	}for(int i=0,j=0;j<hp;j++,i=a[i].nt){
		if((a[i].name=="MP"||a[i].name=="ZP")&&J(i)){
			a[i].p=1,a[i].mp=0;
			return 1;
		}
	}return 0;
}
void F(int x,int y){//决斗。
	if(a[x].name=="MP"&&a[y].name=="ZP"){
		a[y].b--;
		return;
	}if(ok(y))return;
	while(1){
		if(K(y)){
			a[y].b--,die(x,y);
			return;
		}if(K(x)){
			a[x].b--,die(y,x);
			return;
		}
	}return;
}
void N(int x){//南猪入侵。
	for(int i=0,j=0;j<hp;j++,i=a[i].nt){
		if(ok(i)||!K(i)||i==x)continue;
		if(!i&&a[x].p==-1)a[x].mp=1;
		a[i].b--,die(x,i);
	}return;
}
void W(int x){//万箭齐发。
	for(int i=0,j=0;j<hp;j++,i=a[i].nt){
		if(ok(i)||!D(i))continue;
		if(!i&&a[x].p==-1)a[x].mp=1;
		a[i].b--,die(x,i);
	}return;
}
void N_or_W(int x){//有没有上面两个。
	int i=a[x].s.find("N ");
	while(i<a[x].s.size())a[x].s.erase(i,2),N(x),i=a[x].s.find("N ");
	i=a[x].s.find("W ");
	while(i<a[x].s.size())a[x].s.erase(i,2),W(x),i=a[x].s.find("W ");
	return;
}
void pk(int x,int y){//表敌意。
	K_p(x,y);
	int i=a[x].s.find("F ");
	while(i<a[x].s.size()&&a[y].b>0)a[x].s.erase(i,2),F(x,y),i=a[x].s.find("F ");
	return;
}
void pZ(int x){//装备。
	int i=a[x].s.find("Z ");
	while(i<a[x].s.size())a[x].s.erase(i,2),a[x].zp=1,i=a[x].s.find("Z ");
	return;
}
void ed(){//结局。
	cout<<(a[0].b>0?"MP\n":"FP\n");
	for(int i=0;i<n;i++){
		if(a[i].b<1)cout<<"DEAD\n";
		else{
			for(int j=0;j<a[i].s.size();j++)
				if(a[i].s[j]!=' ')cout<<a[i].s[j]<<' ';
			cout<<endl;
		}
	}return;
}
void game(){//游戏。
	while(1){
		for(int i=0,j=0;j<hp;j++,i=a[i].nt){
			pc(i,2),P(i),pZ(i);//摸牌,吃桃,装备。
			if(!i){//主猪出牌。
				N_or_W(i);
				if(a[a[i].nt].mp||!a[a[i].nt].p){
					pk(i,a[i].nt);
					die(i,a[i].nt);
				}else if(a[a[i].lt].mp||!a[a[i].lt].p){
					pk(i,a[i].lt);
					die(i,a[i].lt);
				}
			}
			else if(a[i].name=="ZP"){//忠猪出牌。
				N_or_W(i);
				if(!a[a[i].nt].p){
					pk(i,a[i].nt);
					die(i,a[i].nt);
				}else if(!a[a[i].lt].p){
					pk(i,a[i].lt);
					die(i,a[i].lt);
				}
			}
			else{//反猪出牌。
				N_or_W(i);
				if(a[a[i].nt].p){
					pk(i,a[i].nt);
					die(i,a[i].nt);
				}else if(a[a[i].lt].p){
					pk(i,a[i].lt);
					die(i,a[i].lt);
				}
			}
			if(a[0].b<1||fd>fb){//结束。
				ed();
				return;
			}
		}
	}return;
}
int main(){//开始。
	cin>>n>>m;hp=n;
	for(int i=0;i<n;i++){
		cin>>a[i].name,a[i].p=(!i?1:-1),a[i].mp=(!i);
		getline(cin,a[i].s);
		a[i].s+=' ',a[i].b=4,fb+=(a[i].name=="FP"),a[i].lt=(i+n-1)%n,a[i].nt=(i+1)%n;
	}getline(cin,__),__+=' ';
	game();
  	return 0;
}
2024/6/29 23:00
加载中...