没写完的代码CE求助
查看原帖
没写完的代码CE求助
399116
LYqwq楼主2022/7/2 14:52
#include <iostream>
using namespace std;
const int N=15,M=2e3+5;
// 各种猪
#define MainP ("MP")
#define ZhongP ("ZP")
#define FanP ("FP")
// 基本牌
#define Tao ("P")
#define Sha ("K")
#define Shan ("D")
// 锦囊牌
#define JueDou ("F")
#define NanZhu ("N")
#define WanJian ("W")
#define WuXie ("J")
// 装备牌
#define LianNu ("Z")

struct lstnode;
class Pig;
class MP;
class ZP;
class FP;
class Pigs;

// 全局变量
int n,m; // n 只猪,m 张牌
string cards[M];
int cardcnt; // 所有牌,cardcnt 为牌取走了多少
string tp,cd[4]; // 输入用
bool gameover; // 游戏是否结束
int ztop,zpcnt,ftop,fpcnt; // ztop=新的忠猪在数组中的下标,ftop 同理;zpcnt=还剩的忠猪个数,fpcnt 同理A
// -----------------这里开始报错------------------
MP mp; // 主猪只有一只
ZP zp[N]; // 忠猪反猪可以有多只
FP fp[N];
Pigs piglist;
// 这里结束

struct lstnode{
    int id; // 当前这头猪在相应种类的猪中的下标
    int pos; // 这头猪的编号
    int nxt; // 这头猪之后的一头没寄的猪在 pg 中的下标
    string tp; // 这头猪的种类
    bool isdead(){
        if(tp==MainP) return mp.isdead();
        if(tp==ZhongP) return zp[id].isdead();
        if(tp==FanP) return fp[id].isdead();
    }
};

class Pig{ // 是个猪都有这个类中的东西
    public:
        Pig():cdnum(0),life(4),dead(0){}
        void init(int i,string cd[4]){
            pos=i;
            for(int i=0; i<4; i++)
                cds[++cdnum]={0,cd[i]};
        }
        bool isdead(){return dead;}
        void getcard(){ // 摸牌阶段摸两张
            // 已经将牌堆中的牌摸完了,就一直摸最后一张
            if(cardcnt==m) cds[++cdnum]={0,cards[m]},cds[++cdnum]={0,cards[m]};
            else{
                // 否则可以先摸一张
                cds[++cdnum]={0,cards[++cardcnt]};
                // 摸完一张后如果也摸完了,那就只能重复摸了
                if(cardcnt==m) cds[++cdnum]={0,cards[m]};
                else cds[++cdnum]={0,cards[++cardcnt]}; // 否则还可以摸
            }
        }
        void printcard(){ // 输出剩余的牌
            for(int i=1; i<=cdnum; i++)
                if(!cds[i].isuse)
                    cout << cds[i].tp << " ";
        }
        void use_Tao(int id){life++,cds[id].isuse=1;}
        void use_Sha(int id){
            lstnode p=piglist.nxt(pos);

        }
    protected:
        int life; // 血量
        int cdnum; // 拥有的卡牌数,包括已经用掉的
        int pos; // 编号
        bool dead; // 是否死亡
        struct card{ // 卡牌
            bool isuse; // 是否用过
            string tp; // 类型
        }cds[M];
};

// 主猪
class MP:public Pig{
    public:
        MP(){}
        void playing(){ // 轮到这只猪,开始进行行动
            getcard(); // 先摸牌
            for(int i=1; i<=cdnum; i++){ // 从左到右找到所有没用过的牌,判断能不能用,能用则用
                if(cds[i].isuse) continue; // 用过
                string type=cds[i].tp;
                if(type==Tao && life!=4) use_Tao(i);
                if(type==Sha){
                }
            }
            if(life<=0) dead=true;
        }
};

// 忠猪
class ZP:public Pig{
    public:
        ZP(){}
        void playing(){ // 同主猪
            getcard();
        }
};

// 反猪
class FP:public Pig{
    public:
        FP(){}
        void playing(){ // 同忠猪(绝不路径压缩((()
            getcard();
        }
};

class Pigs{ // 存储所有猪的链表
    public:
        Pigs(){}
        void push_back(int i,string tp,string cd[4]){ // 新增一只猪
            if(tp==MainP){
                pg[i].id=0;
                mp.init(i,cd);
            }else if(tp==ZhongP){
                pg[i].id=ztop=++zpcnt;
                zp[ztop].init(i,cd);
            }else{
                pg[i].id=ftop=++fpcnt;
                fp[ftop].init(i,cd);
            }
            pg[i].pos=i;
            pg[i].nxt=i+1;
        }
        lstnode &nxt(int i){
            int pos=pg[i].nxt;
            while(1){
                if(pg[pos].tp==MainP) break;
                if(pg[pos].tp==ZhongP && !zp[pg[pos].id].isdead()) break;
                if(pg[pos].tp==FanP && !fp[pg[pos].id].isdead()) break;
                pos=pg[pos].nxt;
            }
            pg[i].nxt=pos;
            return pg[pg[i].nxt];
        }
        lstnode &operator[](int i){return pg[i];}
    private:
        lstnode pg[N];
};

int main(){
    cin >> n >> m;
    for(int i=1; i<=n; i++){
        cin >> tp;
        for(int j=0; j<4; j++) cin >> cd[j];
        piglist.push_back(i,tp,cd);
    }
    piglist[n].nxt=1; // 最后一头猪的下一个是主猪(1 号)
    // 开始打架(
    for(lstnode i=piglist[1]; !mp.isdead() && fpcnt; i=piglist.nxt(i.pos)){
        if(i.isdead()) continue;
        if(i.tp==MainP) mp.playing();
        if(i.tp==ZhongP) zp[i.id].playing();
        if(i.tp==FanP) fp[i.id].playing();
    }
    // 输出
    if(mp.isdead()) puts(FanP);
    else puts(MainP);
    for(int i=1; i<=n; i++){
        if(piglist[i].tp==MainP){
            if(mp.isdead()) printf("DEAD");
            else mp.printcard();
        }
        if(piglist[i].tp==ZhongP){
            if(zp[piglist[i].id].isdead()) printf("DEAD");
            else zp[piglist[i].id].printcard();
        }
        if(piglist[i].tp==FanP){
            if(fp[piglist[i].id].isdead()) printf("DEAD");
            else fp[piglist[i].id].printcard();
        }
        puts("");
    }
    return 0;
}

CE了/kk

有没有大佬知道怎么改/kel 谢谢了

2022/7/2 14:52
加载中...