造福后人
查看原帖
造福后人
1392315
Jotaro_sans_347楼主2024/10/1 09:38

关于无懈可击与判断身份的代码,摘自我的一部分AC记录

bool parry(int fr,int to,int flag){//无懈可击模拟 
	int i=fr,j;
	do{
		if(flag){
			if(a[to].behave==a[i].id||(a[to].behave==1&&a[i].id==2)||(a[to].behave==2&&a[i].id==1)){
			//第一次无懈可击:助攻
				for(j=1;j<=a[i].siz;j++){
					if(a[i].deck[j]=='J'){
						a[i].deck[j]='0';
						a[i].behave=a[i].id;
						return !parry(i,fr,0);
					}
				}
			}
		}
		else{
			if(((a[i].id==1||a[i].id==2)&&a[fr].behave==3)||(a[i].id==3&&(a[fr].behave==1||a[fr].behave==2))){
			//无懈可击套娃:打断上一次
				for(j=1;j<=a[i].siz;j++){
					if(a[i].deck[j]=='J'){
						a[i].deck[j]='0';
						a[i].behave=a[i].id;
						return !parry(i,fr,0);
					}
				}
			}
		}
		i=a[i].nxt;
	}while(i!=fr);
	return 0;
}
void duel(int fr,int to){//判断身份 
	int i,l,r;
	if(parry(fr,to,1)) return;
	if(a[fr].id==1&&a[to].id==2){//这个特判要看目标的实际身份
		--a[to].hp;
		if(a[to].hp<=0) dying(fr,to);
		return;
	}
	l=1,r=1;
	while(1){
		while(r<=a[to].siz&&a[to].deck[r]!='K') ++r;
		if(r>a[to].siz){
			--a[to].hp;
			if(a[to].hp<=0) dying(fr,to);
			return;
		}
		else a[to].deck[r]='0';
		//先弃牌
		while(l<=a[fr].siz&&a[fr].deck[l]!='K') ++l;
		if(l>a[fr].siz){
			--a[fr].hp;
			if(a[fr].hp<=0) dying(to,fr);
			return;
		}
		else a[fr].deck[l]='0';
	}
}```
2024/10/1 09:38
加载中...