关于无懈可击与判断身份的代码,摘自我的一部分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';
}
}```