6

· · 个人记录

include <bits/stdc++.h>

using namespace std; int n,m; struct node{ int whatpig;//1 master 2 good 3 bad int blood; int cardsnum; char cards[2005]; bool gun,dead; }pig[11]; int pre[13],beh[13]; int love[13];//0 unknown 1 good 2 bad 3 similarbad queue <char> q; inline char getrand(){ int i=(rand())%100; if(i<=4)return 'P';//桃只能对自己使用 if(i<=34)return 'K'; if(i<=54)return 'D'; if(i<=66)return 'F'; if(i<=78)return 'N'; if(i<=86)return 'W'; if(i<=96)return 'J';//无懈可击使用优先级最低 return 'Z'; }

inline void expla(char f){ if(f=='P')cout<<"桃"; if(f=='K')cout<<"杀"; if(f=='D')cout<<"闪"; if(f=='F')cout<<"决斗"; if(f=='N')cout<<"南蛮入侵"; if(f=='W')cout<<"万箭齐发"; if(f=='J')cout<<"无懈可击"; if(f=='Z')cout<<"诸葛连弩"; return ; }

inline void init(){ cout<<"模拟三国杀游戏:"<<endl<<"请输入角色数:"; cin>>n; cout<<"请输入底牌数(尽量大):"<<endl; cin>>m; cout<<"是否自动生成手牌与底牌? A.是 B.否"; char sy; cin>>sy; cout<<"MP表示主公,ZP表示忠臣,FP表示反贼。"<<endl; string name;

for(int i=1;i<=n;i++){
    pre[i]=i-1;beh[i]=i+1;
    cout<<"请输入"<<i<<"号玩家身份:";
    cin>>name;
    {
        if(name=="MP")pig[i].whatpig=1;
        if(name=="ZP")pig[i].whatpig=2;
        if(name=="FP")pig[i].whatpig=3;
    }
    pig[i].cardsnum=pig[i].blood=4;
    if(sy=='A'){
        cout<<"正在生成"<<i<<"号玩家手牌,TA获得"; 
        for(int j=1;j<=4;j++){
            pig[i].cards[j]=getrand();
            expla(pig[i].cards[j]);
            cout<<' ';
        }
        cout<<endl;
    }
    else{
        for(int j=1;j<=4;j++){
            cin>>pig[i].cards[j];
        }
    }
}
pre[1]=n;beh[n]=1;
love[1]=1;
char f;
if(sy=='A'){
    cout<<"正在生成底牌"<<endl;
    for(int i=1;i<=m;i++){f=getrand();q.push(f);}
}
else{
    for(int i=1;i<=m;i++){cin>>f;q.push(f);}
}

}

inline int win(){ if(pig[1].dead==1)return 2; bool ok=1; for(int i=1;i<=n;i++) if(pig[i].whatpig==3&&pig[i].dead==0) {ok=0;break;} return ok; }

inline void makeorder(int x){ int now=0; for(int i=1;i<=pig[x].cardsnum;i++) if(pig[x].cards[i])pig[x].cards[++now]=pig[x].cards[i]; pig[x].cardsnum=now; }

inline void die(int to,int from){ pig[to].dead=1; int w=win(); if(w){ cout<<to<<"号玩家死亡"<<endl; if(w==1)cout<<"主公胜利"<<endl; else cout<<"反贼胜利"<<endl; while(1); } else{ if(pig[to].whatpig==3){ cout<<to<<"号反贼死亡"<<from<<"玩家摸3张牌"<<endl; for(int i=1;i<=3;i++){ pig[from].cards[++pig[from].cardsnum]=q.front(); if(q.size()!=1)q.pop(); } } else{ if(pig[from].whatpig==1){ cout<<to<<"号忠臣死亡,主公弃置所有牌"<<endl; pig[from].gun=0; for(int i=1;i<=pig[from].cardsnum;i++)pig[from].cards[i]=0; makeorder(from); } else{ cout<<to<<"号忠臣死亡"<<endl; } } { pre[beh[to]]=pre[to]; beh[pre[to]]=beh[to]; } } }

inline void bloodcut(int to,int num,int from){ //cout<<pig[to].blood<<' '; pig[to].blood-=num; //cout<<to<<' '<<num<<' '<<from<<' '<<pig[to].blood<<endl; if(pig[to].blood>0){ cout<<to<<"号玩家扣"<<num<<"点血量,剩余"<<pig[to].blood<<"点血量"<<endl; return ; } cout<<to<<"号玩家扣"<<num<<"点血量,需要1个桃"<<endl; int now=0; for(int i=1;i<=pig[to].cardsnum;i++) if(pig[to].cards[i]=='P') {now=i;break;} if(now){ pig[to].blood++; pig[to].cards[now]=0; makeorder(to); cout<<"有桃了"<<endl; } else{ die(to,from); } }

inline void enemy(int to,int from){ if(love[to]==1)love[from]=2; else love[from]=1; }

inline void senemy(int to,int from){ if(pig[to].whatpig==1&&love[from]==0)love[from]=3; }

inline void friends(int to,int now){ love[now]=love[to]; }

inline void Kkill(int to,int from){ int ok=0; for(int i=1;i<=pig[to].cardsnum;i++) if(pig[to].cards[i]=='D')ok=i; if(ok==0){ bloodcut(to,1,from); } else{ pig[to].cards[ok]=0; makeorder(to); cout<<to<<"号玩家使用闪"<<endl; } enemy(to,from); }

inline bool Jcancel(int to,int from,bool yes){ if(love[to]==0||love[to]==3)return 0; int now=from;bool ff=0; while(1){ if(now==from){ if(ff==0)ff=1; else{ff=0;break;} } int ok=0; if(love[to]==1){ if(yes==1){ if(pig[now].whatpig!=3)ok=1; } else{ if(pig[now].whatpig==3)ok=1; } } if(love[to]==2){ if(yes==1){ if(pig[now].whatpig==3)ok=1; } else{ if(pig[now].whatpig!=3)ok=1; } } if(ok==1){ ok=0; for(int i=1;i<=pig[now].cardsnum;i++) if(pig[now].cards[i]=='J') {ok=i;break;} if(ok){ pig[now].cards[ok]=0; makeorder(now); cout<<now<<"号玩家使用无懈可击"<<endl; if(yes==1)friends(to,now); else enemy(to,now); return Jcancel(to,now,yes^1)^1; } } now=beh[now]; } return 0; }

inline void Fkill(int to,int from){ bool ok=0; enemy(to,from); if(Jcancel(to,from,1)==1){ cout<<"决斗失效"<<endl; return ; } cout<<"决斗即将生效"<<endl; if(pig[from].whatpig==1&&pig[to].whatpig==2){ ok=0; } else{ int l=0,r=0; while(l+1<=pig[to].cardsnum||r+1<=pig[from].cardsnum){ if(ok==0){ l=min(l+1,pig[to].cardsnum); while(l<=pig[to].cardsnum&&pig[to].cards[l]!='K')l++; if(pig[to].cards[l]=='K'){ pig[to].cards[l]=0; cout<<to<<"号玩家出杀"<<endl; } else{ break; } } else{ r=min(r+1,pig[from].cardsnum); while(r<=pig[from].cardsnum&&pig[from].cards[r]!='K')r++; if(pig[from].cards[r]=='K'){ pig[from].cards[r]=0; cout<<from<<"号玩家出杀"<<endl; } else{ break; } } ok^=1; } } makeorder(to);makeorder(from); if(ok==0){ bloodcut(to,1,from); } else{ bloodcut(from,1,to); } }

inline void Nkill(int from){ int kk=beh[from]; while(kk!=from){ if(Jcancel(kk,from,1)==1){ cout<<kk<<"号玩家无需出杀"<<endl; kk=beh[kk]; continue; } int now=0; for(int i=1;i<=pig[kk].cardsnum;i++) if(pig[kk].cards[i]=='K') {now=i;break;} if(now==0){ bloodcut(kk,1,from); senemy(kk,from); } else{ cout<<kk<<"玩家出杀"<<endl; pig[kk].cards[now]=0; makeorder(kk); } kk=beh[kk]; } }

inline void Wkill(int from){ int kk=beh[from]; while(kk!=from){ if(Jcancel(kk,from,1)==1){ cout<<kk<<"号玩家无需出闪"<<endl; kk=beh[kk]; continue; } int now=0; for(int i=1;i<=pig[kk].cardsnum;i++) if(pig[kk].cards[i]=='D') {now=i;break;} if(now==0){ bloodcut(kk,1,from); senemy(kk,from); } else{ cout<<kk<<"玩家出闪"<<endl; pig[kk].cards[now]=0; makeorder(kk); } kk=beh[kk]; } }

inline void work(){ int now=1; while(1){ cout<<endl; {//摸牌 cout<<now<<"号玩家摸牌,获得";expla(q.front()); pig[now].cards[++pig[now].cardsnum]=q.front(); if(q.size()!=1)q.pop(); cout<<"和";expla(q.front());cout<<endl; pig[now].cards[++pig[now].cardsnum]=q.front(); if(q.size()!=1)q.pop(); } {//出牌 bool usedk=0; for(int i=1;i<=pig[now].cardsnum;i++){ switch(pig[now].cards[i]){ case 'P':{ if(pig[now].blood!=4){ pig[now].blood++; pig[now].cards[i]=0; makeorder(now); i--; cout<<now<<"号玩家使用桃,剩余体力"<<pig[now].blood<<"点"<<endl; }

                    break;
                }
                case 'N':{
                    //cout<< 
                    pig[now].cards[i]=0;
                    makeorder(now);
                    i--;
                    cout<<now<<"号玩家使用南蛮入侵"<<endl;
                    Nkill(now);
                    i=0;
                    break;
                }
                case 'W':{
                    pig[now].cards[i]=0;
                    makeorder(now);
                    i--;
                    cout<<now<<"号玩家使用万箭齐发"<<endl;
                    Wkill(now);
                    i=0;
                    break;
                }
                case 'K':{
                    if(usedk==1&&pig[now].gun==0)break;
                    int kk=beh[now];
                    if(love[kk]==0)break;
                    if(pig[now].whatpig==1){
                        if(love[kk]==1)break;
                        pig[now].cards[i]=0;usedk=1;makeorder(now);i--;
                        cout<<now<<"号玩家对"<<kk<<"号玩家使用杀"<<endl;
                        Kkill(kk,now);
                    }
                    if(pig[now].whatpig==2){
                        if(love[kk]==2){
                            pig[now].cards[i]=0;usedk=1;makeorder(now);i--;
                            cout<<now<<"号玩家对"<<kk<<"号玩家使用杀"<<endl;
                            Kkill(kk,now);
                        }
                    }
                    if(pig[now].whatpig==3){
                        if(love[kk]==1){
                            pig[now].cards[i]=0;usedk=1;makeorder(now);i--;
                            cout<<now<<"号玩家对"<<kk<<"号玩家使用杀"<<endl;
                            Kkill(kk,now);
                        }
                    }
                    break;
                }
                case 'F':{
                    int kk=beh[now];
                    if(pig[now].whatpig==1){
                        while((love[kk]==1||love[kk]==0)&&kk!=now)kk=beh[kk];
                        if(kk==now)break;
                        pig[now].cards[i]=0;makeorder(now);i--;
                        cout<<now<<"号玩家对"<<kk<<"号玩家使用决斗"<<endl;
                        Fkill(kk,now);i=0;
                    }
                    if(pig[now].whatpig==2){
                        while(love[kk]!=2&&kk!=now)kk=beh[kk];
                        if(kk==now)break;
                        pig[now].cards[i]=0;makeorder(now);i--;
                        cout<<now<<"号玩家对"<<kk<<"号玩家使用决斗"<<endl;
                        Fkill(kk,now);i=0;
                    }
                    if(pig[now].whatpig==3){
                        kk=1;
                        pig[now].cards[i]=0;makeorder(now);i--;
                        cout<<now<<"号玩家对"<<kk<<"号玩家使用决斗"<<endl;
                        Fkill(kk,now);i=0;
                    }
                    break;
                }
                case 'Z':{
                    pig[now].gun=1;
                    pig[now].cards[i]=0;
                    makeorder(now);
                    i=0;
                    cout<<now<<"号玩家装备诸葛连弩"<<endl; 
                    break;
                }
            }
            if(pig[now].dead==1)break;
        }
    }
    now=beh[now];
}

} int main(){ srand(time(0)); init(); work(); return 0; }