help
查看原帖
help
1284873
LJQ0808楼主2024/11/29 22:43
#include<bits/stdc++.h>
using namespace std;
struct player{
	int cs,hp,nxt,last;
	//cs 手牌数
	//hp 生命值
	char id,card[2010];//id 身份
    bool zgln;//是否装备了【诸葛连弩】
};
player a[20];
char kn[11],kpd[2010],sss[10];
//kn 表示在主公眼里这只猪的身份
//kpd 卡牌堆
int n,m;
int fz;//fz 反贼数量 
bool ed;//ed 判断游戏是否结束
void mp(int x){
    if(!m){
    	m++;
	}
    a[x].card[++a[x].cs]=kpd[m];
    m--;
}//mp 【摸牌】
void js(int x1,int x2) {
    for(int i=1;i<=a[x2].cs;i++){
    	if(a[x2].card[i]=='P'){
            a[x2].card[i]='U';
            a[x2].hp++;
            return;
        }//判断是否有【桃】
	}
    a[a[x2].nxt].last=a[x2].last;
    a[a[x2].last].nxt=a[x2].nxt;//死亡后改变攻击距离 
    if(x2==1){
		ed=1;
		return;
	}
    if(a[x2].id=='F'){
    	fz--;
	}
    if(!fz){
		ed=1;
		return;
	}//没有反贼游戏结束 
    if(a[x2].id=='F'){
    	mp(x1),mp(x1),mp(x1);
	}//击杀反贼摸三张牌 
    if(a[x2].id=='Z' && a[x1].id=='M'){
    	a[x1].cs=0;
		a[x1].zgln=0;
	}//如果主公把忠臣杀了那就要弃牌 
}//js 【击杀】
void Kill(int x1,int x2){
    for(int i=1;i<=a[x2].cs;i++){
    	if(a[x2].card[i]=='D'){
            a[x2].card[i]='U';
            return;
        }
	}
    a[x2].hp--;
    if(!a[x2].hp){
		js(x1,x2);
	}
    //每次造成伤害都要判断被攻击者是否空血
	//然后进入【击杀】环节 
}//Kill【杀】
bool wxkj(int x1,int x2,int x3){
    int i=x1;
    while(1){
        if(x3==1){
            if(kn[x2]==a[i].id || (kn[x2]=='M' && a[i].id=='Z') || (kn[x2]=='Z' && a[i].id=='M')){
            	for(int j=1;j<=a[i].cs;j++){
            		if(a[i].card[j]=='J'){
                        a[i].card[j]='U';
                        kn[i]=a[i].id;
                        return !wxkj(i,x1,0);
                    }
				}
			}//假如是敌对的那就【无懈可击】掉    
        }
        else{
            if(((a[i].id=='M' || a[i].id=='Z') && kn[x1]=='F') || (a[i].id=='F' && (kn[x1]=='M' || kn[x1]=='Z'))){
            	for(int j=1;j<=a[i].cs;j++){
            		if(a[i].card[j]=='J'){
                        a[i].card[j]='U';
                        kn[i]=a[i].id;
                        return !wxkj(i,x1,0);
                    }
				}
			}     
        }
        i=a[i].nxt;
        if(i==x1){
        	break;
		}//没有人用【无懈可击】抵挡此【无懈可击】那么这张牌就生效 
    }
    return 0;
}//wxkj【无懈可击】 
void nmrq(int x1){
    for(int x2=a[x1].nxt;x2!=x1;x2=a[x2].nxt){
    	if(!wxkj(x1,x2,1)){
    		int i;
            for(i=1;i<=a[x2].cs;i++){
            	if(a[x2].card[i]=='K'){
            		a[x2].card[i]='U';
                    break;
				}
			}
            if(i>a[x2].cs){
                a[x2].hp--;
                if(x2==1 && kn[x1]=='U'){
                	kn[x1]='L';
				}
                if(!a[x2].hp){
                	js(x1,x2);
				}
                if(ed){
                	return;
				}
            }
		}//判断是否被【无懈可击】掉 
	}//进行一个循环来出牌
}//nmrq【南蛮入侵】
void wjqf(int x1){
    for(int x2=a[x1].nxt;x2!=x1;x2=a[x2].nxt){
    	if(!wxkj(x1,x2,1)){
			int i;
            for(i=1;i<=a[x2].cs;i++){
            	if(a[x2].card[i]=='D'){
            		a[x2].card[i]='U';
                    break;
				}
			}
            if(i>a[x2].cs){
                a[x2].hp--;
                if(x2==1 && kn[x1]=='U'){
                	kn[x1]='L';
				}
                if(!a[x2].hp){
                	js(x1,x2);
				}
                if(ed){
                	return;
				}
            }
        }//判断是否被【无懈可击】掉 
	}
}//wjqf【万箭齐发】 
void jd(int x1,int x2){
    int j,k;
    if(wxkj(x1,x2,1)){
    	return;
    }//判断是否被【无懈可击】掉 
    if(x1==1 && a[x2].id=='Z'){
        a[x2].hp--;
        if(!a[x2].hp){
        	js(x1,x2);
		}
        return;
    }
    j=k=1;
    while(1){
        while(a[x2].card[j]!='K' && j<=a[x2].cs){
        	j++;
		}
        if(j>a[x2].cs){
            a[x2].hp--;
            if(!a[x2].hp){
            	js(x1,x2);
            }
            return;
        }
        else{
        	a[x2].card[j]='U';
		}
        while(a[x1].card[k]!='K' && k<=a[x1].cs){
        	k++;
		}
        if(k>a[x1].cs){
            a[x1].hp--;
            if(!a[x1].hp){
            	js(x1,x2);
			}
            return;
        }
        else{
        	a[x1].card[k]='U';
		}
    }
}//jd【决斗】 
void hh(){
    char nc;//nc 现在的手牌
    ed=1;
    if(fz){
    	ed=0;
	}
    if(ed){
    	return;
	}
    for(int i=1;i;i=a[i].nxt){
        mp(i),mp(i);
        bool kil=1;
        for(int j=1;j<=a[i].cs;j++){
        	if(a[i].card[j]!='U'){
        		if(!a[i].hp){
        			break;
				}
                nc=a[i].card[j];
                if(nc=='P'){
                    if(a[i].hp!=4){
                    	a[i].hp++,a[i].card[j]='U';
					}
                    continue;
                }//使用【桃】
				if(nc=='K'){
                    if(!kil && !a[i].zgln){
                    	continue;
					}
                    if(a[i].id=='M' && kn[a[i].nxt]!='L' && kn[a[i].nxt]!='F'){
                    	continue;
					}
                    if(a[i].id=='Z' && kn[a[i].nxt]!='F'){
                    	continue;
					}
                    if(a[i].id=='F' && kn[a[i].nxt]!='Z' && kn[a[i].nxt]!='M'){
                    	continue;
					}
                    a[i].card[j]='U';
                    Kill(i,a[i].nxt);
                    kn[i]=a[i].id,kil=0;
                    if(ed){
                    	return;
                    }
                    continue;
                }//使用【杀】
				if(nc=='F'){
                    if(a[i].id=='F'){
                        a[i].card[j]='U',jd(i,1);
                        kn[i]=a[i].id;
                        if(ed){
                        	return;
						}
                        j=0;
                        continue;
                    }
                    for(int k=a[i].nxt;k!=i;k=a[k].nxt){
                    	if((a[i].id=='M' && (kn[k]=='L' || kn[k]=='F')) || (a[i].id=='Z' && kn[k]=='F')){
                            a[i].card[j]='U',jd(i,k);
                            kn[i]=a[i].id;
                            if(ed){
                            	return;
							}
                            j=0;
                            break;
                        }
					}
                    continue;
                }//使用【决斗】
				if(nc=='N'){
                    a[i].card[j]='U';
                    nmrq(i);
                    if(ed){
                    	return;
					}
                    j=0;
                    continue;
                }//使用【南蛮入侵】
                if(nc=='W'){
                    a[i].card[j]='U';
                    wjqf(i);
                    if(ed){
                    	return;
					}
                    j=0;
                    continue;
                }//使用【万箭齐发】 
                if(nc=='Z'){
                    a[i].zgln=1;
                    a[i].card[j]='U';
                    j=0;
                    continue;
                }//装备【诸葛连弩】
			}//=='U'就是被使用过,弃置了 
		}
    }
}//hh 进入回合 
signed main(){
	//HAPPY!
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		a[i].nxt=i+1,a[i].last=i-1;
	}
	a[n].nxt=1,a[1].last=n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<2010;j++){
			a[i].card[j]='U';
		}
		cin>>sss;
		a[i].id=sss[0];
		for(int j=1;j<=4;j++){
			cin>>sss;
			a[i].card[j]=sss[0];
		}
		a[i].cs=a[i].hp=4;//手牌上限和血量上限都是4 
        if(a[i].id=='F'){
        	fz++;
		}//统计反贼的数量 
        a[i].zgln=0;
	}
	for(int i=2;i<=n;i++){
		kn[i]='U';
	}
    kn[1]='M';
    for(int i=1;i<=m;i++){
    	cin>>sss;
		kpd[m-i+1]=sss[0];
	}
	hh();
	if(a[1].hp<=0){//看看主公有没有挂
		cout<<"FP\n";
	}
    else{
    	cout<<"MP\n";
	}
    for(int i=1;i<=n;i++){
        if(a[i].hp<=0){
        	cout<<"DEAD\n";
		}//空血凉凉 
        else{
            for(int j=1;j<=a[i].cs;j++){
            	if(a[i].card[j]!='U'){
            		cout<<a[i].card[j]<<" ";
				}
			}
			cout<<"\n";
        }//亮牌
    }
	return 0;
}

rt

2024/11/29 22:43
加载中...