#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 谢谢了