社区讨论

写了两个下午,15pts

学术版参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo82ukmf
此快照首次捕获于
2023/10/27 11:52
2 年前
此快照最后确认于
2023/10/27 11:52
2 年前
查看原帖
CPP
//PigCountryKill

#include <bits/stdc++.h>
#define ufor(i,pig,b) for(int i=(pig);i<=(b);i++) 
using namespace std;

struct Pig{
    int NumOfCards,hp,nxt,lst;
    char id,card[2005];
    bool ZhugeReCrbow;
}pig[25];
char IdByDir[15],CardPile[2005],op[5];
int n,m,Rebel;
bool End;

void DrawCards(int Object){
    if(m==0){
        m++;
    }
    pig[Object].card[++pig[Object].NumOfCards]=CardPile[m];
    m--;
}

void JudgmentalKill(int Object1,int Object2){
    ufor(i,1,pig[Object2].NumOfCards){
        if(pig[Object2].card[i]=='P'){
            pig[Object2].card[i]='U';
            pig[Object2].hp++;
            return ;
        }
    }
    pig[pig[Object2].nxt].lst=pig[Object2].lst;
    pig[pig[Object2].lst].nxt=pig[Object2].nxt;
    if(Object2==1){
        End=true;
        return ;
    }
    if(pig[Object2].id=='F'){
        Rebel--;
    }
    if(Rebel==0){
        End=true;
        return ;
    }
    if(pig[Object2].id=='F'){
        ufor(i,1,3){
            DrawCards(Object1);
        }
    }
    if(pig[Object2].id=='Z'&&pig[Object1].id=='M'){
        pig[Object1].NumOfCards=0;
        pig[Object1].ZhugeReCrbow=false;
    }
}

void Kill(int Object1,int Object2){
    ufor(i,1,pig[Object2].NumOfCards){
        if(pig[Object2].card[i]=='D'){
            pig[Object2].card[i]='U';
            return ;
        }
    }
    pig[Object2].hp--;
    if(pig[Object2].hp==0){
        JudgmentalKill(Object1,Object2);
    }
}

bool Invulner(int Object1,int Object2,int Object3){
    int i=Object1;
    while(true){
        if(Object3==1){
            if(IdByDir[Object2]==pig[i].id||(IdByDir[Object2]=='M'&&pig[i].id=='Z')||(IdByDir[Object2]=='Z'&&pig[i].id=='M')){
                ufor(j,1,pig[i].NumOfCards){
                    if(pig[i].card[j]=='J'){
                        pig[i].card[j]='U';
                        IdByDir[i]=pig[i].id;
                        return !Invulner(i,Object1,0);
                    }
                }
            }
        }
        else{
            if(((pig[i].id=='M'||pig[i].id=='Z')&&IdByDir[Object1]=='F')||(pig[i].id=='F'&&(IdByDir[Object1]=='Z'))){
                ufor(j,1,pig[i].NumOfCards){
                    if(pig[i].card[j]=='J'){
                        pig[i].card[j]=='U';
                        IdByDir[i]=pig[i].id;
                        return !Invulner(i,Object1,0);
                    }
                }
            }
        }
        i=pig[i].nxt;
        if(i==Object1){
            break;
        }
    }
    return false;
}

void SouthInvasion(int Object1){
    for(int Object2=pig[Object1].nxt;Object2!=Object1;Object2=pig[Object2].nxt){
        if(!Invulner(Object1,Object2,1)){
            int i;
            for(i=1;i<=pig[Object2].NumOfCards;i++){
                if(pig[Object2].card[i]=='K'){
                    pig[Object2].card[i]=='U';
                    break;
                }
            }
            if(i>pig[Object2].NumOfCards){
                pig[Object2].hp--;
                if(Object2==1&&IdByDir[Object1]=='U'){
                    IdByDir[Object1]='L';
                }
                if(pig[Object2].hp==0){
                    JudgmentalKill(Object1,Object2);
                }
                if(End){
                    return ;
                }
            }
        }
    }
}

void ArrowsFired(int Object1){
    for(int Object2=pig[Object1].nxt;Object2!=Object1;Object2=pig[Object2].nxt){
        if(!Invulner(Object1,Object2,1)){
            int i;
            for(i=1;i<=pig[Object2].NumOfCards;i++){
                if(pig[Object2].card[i]=='D'){
                    pig[Object2].card[i]=='U';
                    break;
                }
            }
            if(i>pig[Object2].NumOfCards){
                pig[Object2].hp--;
                if(Object2==1&&IdByDir[Object1]=='U'){
                    IdByDir[Object1]='L';
                }
                if(pig[Object2].hp==0){
                    JudgmentalKill(Object1,Object2);
                }
                if(End){
                    return ;
                }
            }
        }
    }
}

void Duel(int Object1,int Object2){
    if(Invulner(Object1,Object2,1)){
        return ;
    }
    if(Object1==1&&pig[Object2].id=='Z'){
        pig[Object2].hp--;
        if(pig[Object2].hp==0){
            JudgmentalKill(Object1,Object2);
        }
        return ;
    }
    int i,j=1,k=1;
    while(true){
        while(pig[Object2].card[j]!='K'&&j<=pig[Object2].NumOfCards){
            j++;
        }
        if(j>pig[Object2].NumOfCards){
            pig[Object2].hp--;
            if(pig[Object2].hp==0){
                JudgmentalKill(Object1,Object2);
            }
            return ;
        }
        else{
            pig[Object2].card[j]='U';
        }
        while (pig[Object1].card[k]!='K'&&k<=pig[Object1].NumOfCards){
            k++;
        }
        if(k>pig[Object1].NumOfCards){
            pig[Object1].hp--;
            if(pig[Object1].hp==0){
                JudgmentalKill(Object2,Object1);
            }
            return ;
        }
        else{
            pig[Object1].card[k]='U';
        }
    }
}

void EnterRound(){
    char NowCard;
    End=true;
    if(Rebel>0){
        End=false;
    }
    if(End){
        return ;
    }
    for(int i=1;i;i=pig[i].nxt){
        DrawCards(i);
        DrawCards(i);
        bool kill=true;
        ufor(j,1,pig[i].NumOfCards){
            if(pig[i].card[j]!='U'){
                if(pig[i].hp==0){
                    break;
                }
                NowCard=pig[i].card[j];
                if(NowCard=='P'){
                    if(pig[i].hp!=4){
                        pig[i].hp++;
                        pig[i].card[j]='U';
                    }
                    continue;
                }
                if(NowCard=='K'){
                    if(!kill&&!pig[i].ZhugeReCrbow){
                        continue;
                    }
                    if(pig[i].id=='M'&&IdByDir[pig[i].nxt]!='L'&&IdByDir[pig[i].nxt]!='F'){
                        continue;
                    }
                    if(pig[i].id=='F'&&IdByDir[pig[i].nxt]!='Z'&&IdByDir[pig[i].nxt]!='M'){
                        continue;
                    }
                    if(pig[i].id=='Z'&&IdByDir[pig[i].nxt]!='F'){
                        continue;
                    }
                    pig[i].card[j]='U';
                    Kill(i,pig[i].nxt);
                    IdByDir[i]=pig[i].id;
                    kill=false;
                    if(End){
                        return ;
                    }
                    continue;
                }
                if(NowCard=='F'){
                    if(pig[i].id=='F'){
                        pig[i].card[j]='U';
                        Duel(i,1);
                        IdByDir[i]=pig[i].id;
                        if(End){
                            return ;
                        }
                        j=0;
                        continue;
                    }
                    for(int k=pig[i].nxt;k!=i;k=pig[k].nxt){
                        if((pig[i].id=='M'&&(IdByDir[k]=='L'||IdByDir[k]=='F'))||(pig[i].id=='Z'&&IdByDir[k]=='F')){
                            pig[i].card[j]='U';
                            Duel(i,k);
                            IdByDir[i]=pig[i].id;
                            if(End){
                                return ;
                            }
                            j=0;
                            break;
                        }
                    }
                    continue;
                }
                if(NowCard=='N'){
                    pig[i].card[j]='U';
                    SouthInvasion(i);
                    if(End){
                        return ;
                    }
                    j=0;
                    continue;
                }
                if(NowCard=='W'){
                    pig[i].card[j]='U';
                    ArrowsFired(i);
                    if(End){
                        return ;
                    }
                    j=0;
                    continue;
                }
                if(NowCard=='Z'){
                    pig[i].ZhugeReCrbow=true;
                    pig[i].card[j]='U';
                    j=0;
                    continue;
                }
            }
        }
    }
}

int main(){
    cin >>n >>m;
    ufor(i,1,n){
        pig[i].nxt=i+1;
        pig[i].lst=i-1;
    }
    pig[n].nxt=1;
    pig[1].lst=n;
    ufor(i,1,n){
        ufor(j,1,2005){
            pig[i].card[j]='U';
        }
        cin >>op;
        pig[i].id=op[0];
        ufor(j,1,4){
            cin >>op;
            pig[i].card[j]=op[0];
        }
        pig[i].NumOfCards=pig[i].hp=4;
        if(pig[i].id=='F'){
            Rebel++;
        }
        pig[i].ZhugeReCrbow=false;
    }
    ufor(i,2,n){
        IdByDir[i]='U';
    }
    IdByDir[1]='M';
    ufor(i,1,m){
        cin >>op;
        CardPile[m-i+1]=op[0];
    }
    EnterRound();
    if(pig[1].hp<=0){
        cout <<"FP\n";
    }
    else{
        cout <<"MP\n";
    }
    ufor(i,1,n){
        if(pig[i].hp<=0){
            cout <<"DEAD\n";
        }
        else{
            ufor(j,1,pig[i].NumOfCards){
                if(pig[i].card[j]!='U'){
                    cout <<pig[i].card[j] <<" ";
                }
            }
            cout <<"\n";
        }
    }
    return 0;
}
有好心人帮忙查一下BUG吗QAQ
应该能看出来这是猪国杀(

回复

2 条回复,欢迎继续交流。

正在加载回复...