30分,无懈可击循环判定不会写,求助
查看原帖
30分,无懈可击循环判定不会写,求助
746790
space_sea楼主2024/9/28 14:12

求助

#include <bits/stdc++.h>
using namespace std;
//void file_init(){
//#ifndef ONLINE_JUDGE
//    freopen("in","r",stdin);
//    freopen("out","w",stdout);
//#endif
//    return ;
//}
struct node{
    int K, D, P, F, N, W, J, Z;//手牌 杀:K 闪:D 桃:P 决斗:F 南猪入侵:N 万箭齐发:W 无懈可击:J 猪哥连弩:Z 
    int id, st, hp;//身份(1主猪, 2忠猪, 3反猪),状态(1跳忠,2跳反),血量
    int lst,nxt;
    bool z;
    bool Dead, pig_pig;//目前状态(0死了,1活着), 类反猪判定(0不是,1是)
    string card_self;//自己目前持有卡牌
}e[11];
char card[2010];
int start, card_now=1, tips_L, tips_R, n, m, dead_cnt;//游戏开始位置,卡牌目前位置,全局锦囊牌右端点, 全局锦囊牌右端点,人数,卡牌数,死的人数
bool kill_cnt;//杀的限制
void card_delate(int go, char s){//删牌
    e[go].card_self.erase(e[go].card_self.find(s), 1);
    return ;
}
void id_check(int i, string s){//身份标记
    if (s=="MP"){
        e[i].id=1;
        start=i;
    }
    if (s=="ZP"){
        e[i].id=2;
    }
    if (s=="FP"){
        e[i].id=3;
    }
}
void card_check(int i, char s){//卡牌加加
    e[i].card_self+=s;
    if (s=='K'){
        e[i].K++;
    }
    if (s=='D'){
        e[i].D++;   
    }
    if (s=='P'){
        e[i].P++;
    }
    if (s=='F'){
        e[i].F++;
    }
    if (s=='N'){
        e[i].N++;
    }
    if (s=='W'){
        e[i].W++;
    }
    if (s=='J'){
        e[i].J++;
    }
    if (s=='Z'){
        e[i].Z++;
    }
    return ;
}
void gameover_check(){//判断游戏是否结束
    bool flag_mp=1, flag_fp=0;//判断主猪是否胜存活(0死亡,1存活),判断反猪是否存活(0死亡,1存活)
    for (int i=1; i<=n; i++){
        if (e[i].id==1&&!e[i].Dead){//若主猪已经死亡
            flag_mp=0;//毁灭吧!!!!!
        }
        if (e[i].id==3&&e[i].Dead){//若反猪还有存活的
            flag_fp=1;//人在,阵地在!
        }
    }
    if (flag_mp&&flag_fp){
        return;
    }
    if (!flag_mp){
        cout << "FP\n";
    }
    if (!flag_fp){
        cout << "MP\n";
    }
    for (int i=1; i<=n; i++){
        if (!e[i].Dead){//若该角色已经死亡
            cout << "DEAD\n";//输出已死亡
        }else{
            for (int j=0; j<e[i].card_self.size(); j++){//否则输出他的所有手牌
                cout << e[i].card_self[j] << " ";
            }
            cout << endl;
        }
    }
    exit(0);
}
void dead(int go, int now){//死亡判定
    if (e[now].hp){
        return;
    }
    if(e[now].P){
        e[now].hp++;
        e[now].P--;
        card_delate(now,'P');
        return ;
    }
    e[now].Dead=0;
    dead_cnt++;
    gameover_check();//检测游戏是否结束
    if (e[now].id==3){//杀反猪奖励
        for (int i=1; i<=3; i++){
            card_check(go, card[card_now]);
            if(card_now<m){
                card_now++;
            }
        }
    }
    if (e[go].id==1&&e[now].id==2){//主猪杀忠猪惩罚
        e[go].card_self.clear();
        e[go].K=0;
        e[go].D=0;
        e[go].P=0;
        e[go].F=0;
        e[go].N=0;
        e[go].W=0;
        e[go].J=0;
        e[go].Z=0;
    }
    e[e[now].lst].nxt=e[now].nxt;
    e[e[now].nxt].lst=e[now].lst;
    return ;
}
void kill_check(int go, int now){//杀结算
    if (e[now].D){//闪判定
        e[now].D--;
        card_delate(now, 'D');
    }else{//无闪,减血
        e[now].hp--;
        dead(go, now);
    }
    return ;
}
void dule_check(int go, int now){//决斗结算
    if (e[go].id==1&&e[now].id==2){//忠猪对主猪
        e[now].hp--;
        dead(go, now);
        return;
    }
    if (e[go].K<e[now].K){//打不过...
        e[now].K--;
        card_delate(now,'K');
        swap(go, now);//交换攻防...
    }
    e[go].K-=e[now].K;//打他猪的!
    int a=e[now].K;//临时储存
    e[now].K=0;
    for (int i=1; i<=a; i++){//删牌
        card_delate(go, 'K');
        card_delate(now, 'K');
    }
    e[now].hp--;
    dead(go, now);
}
bool card_put(int go, char put){//出牌
    if(put=='Z'){
        e[go].Z--;
        card_delate(go,put);
        kill_cnt=0;
        e[go].z=1;
        return 1;
    }
    if(put=='F'){
        if(e[go].id==3){
            e[go].st=2;//跳反
            card_delate(go,put);
            dule_check(go,1);
            return 1;
        }
        for(int now=e[go].nxt;now!=go;now=e[now].nxt){
            bool flag=0;
            if (e[go].id==1&&(e[now].st==2||e[now].pig_pig)){//主猪满足杀猪条件
                flag=1;
            }
            if (e[go].id==2&&e[now].st==2){//忠猪满足杀猪条件
                e[go].st=1, e[go].pig_pig=0;//跳忠
                flag=1;
            }
            if(flag){
                card_delate(go,put);
                dule_check(go,now);
                return 1;
            }
        }
    }
    if (put=='K'&&!kill_cnt){//K:杀判定+F判定(杀和决斗的代码很像,放一起节省空间)
        bool flag=0;//是否杀到猪
        int now=e[go].nxt;
        if (e[go].id==1&&(e[now].st==2||e[now].pig_pig)){//主猪满足杀猪条件
            flag=1;
        }
        if (e[go].id==2&&e[now].st==2){//忠猪满足杀猪条件
            e[go].st=1, e[go].pig_pig=0;//跳忠
            flag=1;
        }
        if (e[go].id==3&&(e[now].id==1||e[now].st==1)){//反猪满足杀猪条件
            e[go].st=2;//跳反
            flag=1;
        }
        if (flag){
            e[go].K--;//牌的数量--
            card_delate(go,put);
            kill_check(go, now);//杀猪判定
            if (!e[go].z){//判断有没有猪哥连弩
                kill_cnt=1;//若没有,杀人限制开启
            }
            return 1;
        }
    }
    if (put=='P'&&e[go].hp<4){//D:桃判定
        e[go].P--;
        card_delate(go,put);
        e[go].hp++;
        return 1;
    }
    if (put=='N'||put=='W'){//南猪入侵和万箭齐发
        card_delate(go,put);
        for(int now=e[go].nxt;now!=go;now=e[now].nxt){
            if (e[now].st!=0){//已经跳了
                
            }else{//没跳身份,不能自己救自己
                if (put=='N'){//南猪入侵
                    if (e[now].K){
                        e[now].K--;
                        card_delate(now, 'K');
                    }else{
                        if(now==1){
                            e[go].pig_pig=1;
                        }
                        e[now].hp--;
                        dead(go, now);
                    }
                }else{//万箭齐发
                    if (e[now].D){
                        e[now].D--;
                        card_delate(now, 'D');
                    }else{
                        if(now==1){
                            e[go].pig_pig=1;
                        }
                        e[now].hp--;
                        dead(go, now);
                    }
                }
            }
        }
        return 1;
    }
    return 0;
}
int main(){
    // file_init();
    memset(e, 0, sizeof(e));
    cin >> n >> m;//n=3 m=10                                                                 check
    for (int i=1; i<=n; i++){
        e[i].hp=4, e[i].Dead=1;
        string s;
        cin >> s;
        id_check(i, s);//                                                                    check
        char ch;
        for (int j=1; j<=4; j++){
            cin >> ch;
            card_check(i, ch);//                                                             check
        }
        e[i].nxt=i+1;
        e[i].lst=i-1;
    }
    e[1].lst=n;
    e[n].nxt=1;
    for (int i=1; i<=m; i++){
        cin >> card[i];//                                                                    check
    }
    int round=0,now=1;
    while(1){
        gameover_check();//检测游戏是否结束                                                   check
        // cout << "Debug1\n";
        // cerr<<++round<<"\n";
        kill_cnt=0;//杀人限制重置
        for (int j=1; j<=2; j++){//摸牌阶段
            card_check(now, card[card_now]);
            if(card_now<m){
                card_now++;
            }
        }
        for (int j=0; j<e[now].card_self.size(); j++){
            if (card_put(now, e[now].card_self[j])){//检测是否使用该卡
                j=-1;
                if(!e[now].Dead){
                    break;
                }
            }
        }
        now=e[now].nxt;
    }

    return 0;
}
2024/9/28 14:12
加载中...