BZOJ1972: [Sdoi2010]猪国杀 (模拟)

终结这道题也是很长时间的梦想了吧,祝自己NOIP2018rp++。

传送门:

解题思路:

模拟没什么好说的,这里主要提几个坑点。

第一个:桃的使用,在判定血量后在函数中单独使用。

第二个:索引不要搞乱。

第三个:每次都要重新枚举手牌(从左向右)

第四个:对于无懈可击,递归求解,我比较喜欢新建经典反猪和经典忠猪,划分阵营来搞。主要是一个递归函数,返回bool形变量,表示无懈是否成功。

第五个:这个是题目的错误,当牌堆空了时,直接重复摸最后一张。

这里有几个小技巧。

1.函数先声明再定义,有利于理清思路,调试时也比较方便。

2.对场景和角色分别定义函数。

3.划阵营来判断做法,最好有两种状态:自己的和表现的。这样也不用担心忠猪跳反或反猪跳忠了。

最后是代码:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 struct Pig{
  5     /*身份*/
  6     bool Mp;
  7     bool Zp;
  8     bool Ap;
  9     /*外部显示*/
 10     bool aM;
 11     bool aZ;
 12     bool aA;
 13     bool LA;
 14     bool Apd;//表明身份
 15     bool Wep;
 16     int lst;
 17     int nxt;
 18     /*个人信息-全局*/
 19     bool dead;
 20     int Hp;
 21     int nk;
 22     int num;
 23     int card[10000];
 24     bool usd[10000];
 25     /*个人信息-回合*/
 26     int nmk;//当局使用杀的个数 
 27     bool eat_peach(void);
 28     bool use_kill(void);
 29     bool use_dodge(void);
 30     bool use_nxkj(void);
 31     void Profile(char *a);
 32     void Insert(int x);
 33     void New(void);
 34     void print(void);
 35     void Drw(void);
 36     void arm(void);
 37     void clear(void);
 38     void pro(void);
 39 }p[100];
 40 /*动态统计*/
 41 int sta;
 42 int numA;
 43 int Apa;
 44 bool Game_is_going_on; 
 45 /*全局信息*/
 46 int n,m;
 47 int top;
 48 char opt[10];
 49 int hep[100000];
 50 bool Rlts(int usr_a,int U);
 51 bool Nxkj(int user,int chr);
 52 bool Can_duel(int user);
 53 bool Can_use_kill(int user);
 54 int trans(char *a);
 55 int Pick(int user);
 56 int Enyd(int user);
 57 int anti(int user);
 58 void Act(int user);
 59 void Die(int user,int killer);
 60 void Cur(int user,int killer,int dlt);
 61 void Use(int user,int type);
 62 void Use_kill(int user);
 63 void Use_duel(int user);
 64 void Use_Sprq(int user);
 65 void Use_Ttaf(int user);
 66 void Peach_use_prol(int user);
 67 void Apear(int user);
 68 void Game_end(void);
 69 void print_it(int x);
 70 void check(void);
 71 int main()
 72 {
 73 //    freopen("20.in","r",stdin);
 74     Game_is_going_on=true;
 75     sta=1;
 76     scanf("%d%d",&n,&m);
 77     for(int i=1;i<=n;i++)
 78     {
 79         scanf("%s",opt+1);
 80         p[i].Profile(opt);
 81         for(int j=1;j<=4;j++)
 82         {
 83             scanf("%s",opt+1);
 84             p[i].Insert(trans(opt));
 85         }
 86         p[i].nxt=i+1;
 87         p[i].lst=i-1;
 88     }
 89     p[1].lst=n;
 90     p[n].nxt=1;
 91     p[80].Apd=true;
 92     p[80].aZ=true;
 93     p[80].Zp=true;
 94     p[81].Apd=true;
 95     p[81].aA=true;
 96     p[81].Ap=true;
 97     top=m;
 98     for(int i=1;i<=m;i++)
 99     {
100         scanf("%s",opt+1);
101         hep[m-i+1]=trans(opt);
102     }
103     while(Game_is_going_on)
104         Act(sta);
105     Game_end();
106     return 0;
107 }
108 /*
109     桃(P):1
110     在自己的回合内,如果自己的体力值不等于体力上限,
111     那么使用一个桃可以为自己补充一点体力,否则不能使用桃;
112     桃只能对自己使用;在自己的回合外,如果自己的血变为0或者更低,那么也可以使用;
113     杀(K):2
114     在自己的回合内,对攻击范围内除自己以外的一名角色使用。
115     如果没有被『闪』抵消,则造成1点伤害。无论有无武器,杀的攻击范围都是1;
116     闪(D):3
117     当你受到杀的攻击时,可以弃置一张闪来抵消杀的效果;
118     锦囊: 
119     决斗(F):4
120     出牌阶段,对除自己以外任意一名角色使用,由目标角色先开始,
121     自己和目标角色轮流弃置一张杀,首先没有杀可弃的一方受到1点伤害,另一方视为此伤害的来源;
122     南猪入侵(N):5
123     出牌阶段,对除你以外所有角色使用,按逆时针顺序从使用者下家开始依次结算,
124     除非弃置一张杀,否则受到1点伤害;
125     万箭齐发(W):6
126     和南猪入侵类似,不过要弃置的不是杀而是闪;
127     无懈可击(J):7
128     在目标锦囊生效前抵消其效果。每次有一张锦囊即将生效时,从使用这张锦囊的猪开始,
129     按照逆时针顺序,依次得到使用无懈可击的机会;
130     效果:用于决斗时,决斗无效并弃置;用于南猪入侵或万箭齐发时,当结算到某个角色时
131     才能使用,当前角色不需弃置牌并且不会受到伤害(仅对一个角色产生效果);用于无
132     懈可击时,成为目标的无懈可击被无效。
133     猪哥连弩(Z):8
134     武器,攻击范围1,出牌阶段你可以使用任意张杀;
135     同一时刻最多只能装一个武器;如果先前已经有了一把武器,那么之后再装武器的话,
136     会弃置以前的武器来装现在的武器;
137 */
138 int trans(char *a)
139 {
140     if(a[1]=='P')
141         return 1;//
142     if(a[1]=='K')
143         return 2;//
144     if(a[1]=='D')
145         return 3;//
146     if(a[1]=='F')
147         return 4;//决斗
148     if(a[1]=='N')
149         return 5;//南猪入侵
150     if(a[1]=='W')
151         return 6;//万箭齐发
152     if(a[1]=='J')
153         return 7;//无懈可击
154     if(a[1]=='Z')
155         return 8;//猪哥连弩 
156 }
157 void Act(int user)
158 {
159     check();
160 //    p[user].pro();
161 //    printf(":");
162     if(!Game_is_going_on)
163         return ;
164     p[user].New();
165     p[user].Drw();
166     p[user].Drw();
167     int c=Pick(user);
168 //    if(c)
169 //        p[user].print();
170     while(c)
171     {
172 //        p[user].pro();
173 //        printf("Hp: %d card: ",p[user].Hp);
174 //        print_it(c);
175 //        puts("");
176         Use(user,c);
177 //        p[user].print();
178         if(p[user].dead)
179             break;
180         c=Pick(user);
181     }
182 //    p[user].print();
183     do{
184         sta=p[sta].nxt;
185     }while(p[sta].dead);
186     return ;
187 }
188 int Pick(int user)
189 {
190     bool *u=p[user].usd;
191     int *c=p[user].card;
192     for(int i=1;i<=p[user].num;i++)
193     {
194         if(u[i]||c[i]==3||c[i]==7)
195             continue;
196         if(c[i]==1)
197         {
198             Peach_use_prol(user);
199             continue;
200         }
201         if(c[i]==8)
202         {
203             p[user].arm();
204             u[i]=true;
205             i=0;
206             continue;
207         }
208         if((c[i]==2&&Can_use_kill(user))||(c[i]==4&&Can_duel(user))||(c[i]==5)||(c[i]==6))
209         {
210             u[i]=true;
211             return c[i];
212         }
213     }
214     return 0;
215 }
216 void Use(int user,int type)
217 {
218     if(type==2)
219         Use_kill(user);
220     if(type==4)
221         Use_duel(user);
222     if(type==5)
223         Use_Sprq(user);
224     if(type==6)
225         Use_Ttaf(user);
226     return ;
227 }
228 void Peach_use_prol(int user)
229 {
230     if(p[user].Hp==4)
231         return ;
232     p[user].eat_peach();
233     return ;
234 }
235 bool Can_use_kill(int user)
236 {
237     int enemy=p[user].nxt;
238     if(p[user].nmk>=1&&!p[user].Wep)
239         return false;
240     if(p[user].Mp)
241         if((p[enemy].Apd&&p[enemy].aA)||p[enemy].LA)
242         {
243             p[user].nmk++;
244             return true;
245         }
246     if(!p[enemy].Apd)
247         return false;
248     if((p[enemy].aZ&&p[user].Ap)||(p[enemy].aA&&p[user].Zp)||(p[enemy].Mp&&p[user].Ap))
249     {
250         p[user].nmk++;
251         return true;
252     }
253     return false;
254 }
255 bool Can_duel(int user)
256 {
257     if(p[user].Ap)
258         return true;
259     if(p[user].Zp)
260         for(int i=p[user].nxt;i!=user;i=p[i].nxt)
261             if(p[i].aA)
262                 return true;
263     if(p[user].Mp)
264         for(int i=p[user].nxt;i!=user;i=p[i].nxt)
265             if(p[i].LA||p[i].aA)
266                 return true;
267     return false;
268 }
269 void check(void)
270 {
271     if(p[1].Hp<=0||!numA)
272         Game_is_going_on=false;
273     return ;
274 }
275 void Use_kill(int user)
276 {
277     int enemy=p[user].nxt;
278     Apear(user);
279     if(p[enemy].use_dodge())
280         return ;
281     Cur(enemy,user,1);
282     return ;
283 }
284 void Use_duel(int user)
285 {
286     int enemy=Enyd(user);
287 //    printf("Fight\n        Pig_a: %d Pig_b: %d\n",user,enemy);
288     if(user==1&&p[enemy].LA&&!p[enemy].Apd)
289     {
290         Cur(enemy,user,1);
291         return ;
292     }
293     Apear(user);
294     if(Nxkj(user,enemy))
295         return ;
296     while(p[enemy].use_kill())
297         std::swap(user,enemy);
298 //    printf("lose life: ");
299 //    p[enemy].pro();
300 //    puts("");
301     Cur(enemy,user,1);
302     return ;
303 }
304 void Use_Sprq(int user)
305 {
306     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
307     {
308         if(Nxkj(user,i))
309             continue;
310         if(p[i].use_kill())
311             continue;
312 //        printf("lose life: ");
313 //        p[i].pro();
314 //        puts("");
315         Cur(i,user,1);
316         if(i==1&&!p[user].Apd)
317             p[user].LA=true;
318     }
319     return ;
320 }
321 void Use_Ttaf(int user)
322 {
323     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
324     {
325         if(Nxkj(user,i))
326             continue;
327         if(p[i].use_dodge())
328             continue;
329 //        printf("lose life: ");
330 //        p[i].pro();
331 //        puts("");
332         Cur(i,user,1);
333         if(i==1&&!p[user].Apd)
334             p[user].LA=true;
335     }
336     return ;
337 }
338 void Apear(int user)
339 {
340     p[user].aM=p[user].Mp;
341     p[user].aZ=p[user].Zp;
342     p[user].aA=p[user].Ap;
343     p[user].LA=false;
344     p[user].Apd=true;
345     return ;
346 }
347 void Cur(int user,int killer,int dlt)
348 {
349     p[user].Hp--;
350     if(p[user].Hp>0)
351         return ;
352     while(p[user].Hp<=0&&p[user].eat_peach());
353     if(p[user].Hp<=0)
354         Die(user,killer);
355     return ;
356 }
357 int Enyd(int user)
358 {
359     if(p[user].Ap)
360         return 1;
361     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
362         if((p[i].Apd&&p[i].aA)||((!p[i].Apd)&&p[i].LA&&p[user].Mp))
363             return i;
364 }
365 bool Nxkj(int user,int chr)
366 {
367     
368     bool ansl;
369     if(!p[chr].Apd)
370         return false;
371     int i=user;
372     ansl=false;
373     do{
374         if(Rlts(i,chr)&&p[i].use_nxkj())
375         {
376             Apear(i);
377             return !Nxkj(i,anti(chr));
378         }
379         i=p[i].nxt;
380     }while(i!=user);
381     return false;
382 }
383 bool Rlts(int usr_a,int U)
384 {
385     if(p[usr_a].Mp&&p[U].Mp)
386         return true;
387     if(p[usr_a].Zp&&p[U].aZ)
388         return true;
389     if(p[usr_a].Zp&&p[U].aM)
390         return true;
391     if(p[usr_a].Mp&&p[U].aZ)
392         return true;
393     if(p[usr_a].Ap&&p[U].aA)
394         return true;
395     return false;
396 }
397 void Die(int user,int killer)
398 {
399     p[user].dead=true;
400     p[p[user].lst].nxt=p[user].nxt;
401     p[p[user].nxt].lst=p[user].lst;
402     if(p[user].Ap)
403     {
404         numA--;
405         if(!numA)
406             Game_end();
407         for(int i=1;i<=3;i++)
408             p[killer].Drw();
409     }
410     if(p[user].Mp)
411         Game_end();
412     if(p[user].Zp&&killer==1)
413         p[1].clear();
414     return ;
415 }
416 void Game_end(void)
417 {
418     if(!numA)
419         puts("MP");
420     else
421         puts("FP");
422     for(int i=1;i<=n;i++)
423         p[i].print();
424     exit(0);
425 }
426 int anti(int user)
427 {
428     if(p[user].Ap)
429         return 80;
430     return 81;
431 }
432 void print_it(int x)
433 {
434     if(x==1)
435         printf("P ");
436     if(x==2)
437         printf("K ");
438     if(x==3)
439         printf("D ");
440     if(x==4)
441         printf("F ");
442     if(x==5)
443         printf("N ");
444     if(x==6)
445         printf("W ");
446     if(x==7)
447         printf("J ");
448     if(x==8)
449         printf("Z ");
450 }
451 void Pig::Profile(char *a)
452 {
453     Hp=4;
454     if(a[1]=='M')
455     {
456         Mp=true;
457         aM=true;
458         Apd=true;
459     }
460     if(a[1]=='Z')
461         Zp=true;
462     if(a[1]=='F')
463     {
464         Ap=true;
465         numA++;
466     }
467     return ;
468 }
469 void Pig::Insert(int x)
470 {
471     card[++num]=x;
472     usd[num]=false;
473     return ;
474 }
475 void Pig::New(void)
476 {
477     nmk=0;
478     return ;
479 }
480 void Pig::Drw(void)
481 {
482     if(!top)
483         top=1;
484     Insert(hep[top--]);
485     return ;
486 }
487 void Pig::arm(void)
488 {
489     Wep=true;
490     return ;
491 }
492 bool Pig::eat_peach(void)
493 {
494     if(Hp==4)
495         return false;
496     for(int i=1;i<=num;i++)
497         if(usd[i]==0&&card[i]==1)
498         {
499             if(Hp==4)
500                 return false;
501             usd[i]=true;
502             Hp++;
503             return true;
504         }
505     return false;
506 }
507 bool Pig::use_dodge(void)
508 {
509     for(int i=1;i<=num;i++)
510         if(usd[i]==0&&card[i]==3)
511         {
512             usd[i]=true;
513             return true;
514         }
515     return false;
516 }
517 bool Pig::use_kill(void)
518 {
519     for(int i=1;i<=num;i++)
520         if(usd[i]==0&&card[i]==2)
521         {
522             usd[i]=true;
523             return true;
524         }
525     return false;
526 }
527 bool Pig::use_nxkj(void)
528 {
529     for(int i=1;i<=num;i++)
530         if(usd[i]==0&&card[i]==7)
531         {
532             usd[i]=true;
533             return true;
534         }
535     return false;
536 }
537 void Pig::clear(void)
538 {
539     num=0;
540     Wep=false;
541     memset(card,0,sizeof(card));
542     memset(usd,0,sizeof(usd));
543     return ;
544 }
545 void Pig::print(void)
546 {
547     if(dead)
548         printf("DEAD");
549     else
550         for(int i=1;i<=num;i++)
551             if(!usd[i])
552                 print_it(card[i]);
553     printf("\n");
554     return ;
555 }
556 void Pig::pro(void)
557 {
558     if(Mp)
559         printf("Mp ");
560     if(Zp)
561         printf("Zp ");
562     if(Ap)
563         printf("Ap ");
564     return ;
565 }

压行以后:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 struct Pig{
  5     /*身份*/
  6     bool Mp,Zp,Ap,aM,aZ,aA,LA,Apd,Wep,dead,usd[10000];;
  7     int lst,nxt,Hp,nk,num,nmk,card[10000];
  8     bool eat_peach(void);
  9     bool use_kill(void);
 10     bool use_dodge(void);
 11     bool use_nxkj(void);
 12     void Profile(char *a);
 13     void Insert(int x);
 14     void New(void);
 15     void print(void);
 16     void Drw(void);
 17     void arm(void);
 18     void clear(void);
 19     void pro(void);
 20 }p[100];
 21 /*动态统计*/
 22 int sta,numA,Apa,n,m,top,hep[100000];
 23 bool Game_is_going_on; 
 24 char opt[10];
 25 bool Rlts(int usr_a,int U);
 26 bool Nxkj(int user,int chr);
 27 bool Can_duel(int user);
 28 bool Can_use_kill(int user);
 29 int trans(char *a);
 30 int Pick(int user);
 31 int Enyd(int user);
 32 int anti(int user);
 33 void Act(int user);
 34 void Die(int user,int killer);
 35 void Cur(int user,int killer,int dlt);
 36 void Use(int user,int type);
 37 void Use_kill(int user);
 38 void Use_duel(int user);
 39 void Use_Sprq(int user);
 40 void Use_Ttaf(int user);
 41 void Peach_use_prol(int user);
 42 void Apear(int user);
 43 void Game_end(void);
 44 void print_it(int x);
 45 void check(void);
 46 int main()
 47 {
 48     Game_is_going_on=true;sta=1;
 49     scanf("%d%d",&n,&m);
 50     for(int i=1;i<=n;i++)
 51     {
 52         scanf("%s",opt+1);p[i].Profile(opt);
 53         for(int j=1;j<=4;j++){scanf("%s",opt+1);p[i].Insert(trans(opt));}
 54         p[i].nxt=i+1,p[i].lst=i-1;
 55     }
 56     p[1].lst=n;p[n].nxt=1;p[80].Apd=true;p[80].aZ=true;p[80].Zp=true;p[81].Apd=true;p[81].aA=true;p[81].Ap=true;top=m;
 57     for(int i=1;i<=m;i++){scanf("%s",opt+1);hep[m-i+1]=trans(opt);}
 58     while(Game_is_going_on)Act(sta);Game_end();
 59     return 0;
 60 }
 61 int trans(char *a){if(a[1]=='P')return 1;if(a[1]=='K')return 2;if(a[1]=='D')return 3;if(a[1]=='F')return 4;if(a[1]=='N')return 5;if(a[1]=='W')return 6;if(a[1]=='J')return 7;if(a[1]=='Z')return 8; }
 62 void Act(int user)
 63 {
 64     check();
 65     if(!Game_is_going_on)return ;
 66     p[user].New();p[user].Drw();p[user].Drw();
 67     int c=Pick(user);
 68     while(c){Use(user,c);if(p[user].dead)break;c=Pick(user);}
 69     do{sta=p[sta].nxt;}while(p[sta].dead);
 70 }
 71 int Pick(int user)
 72 {
 73     bool *u=p[user].usd;
 74     int *c=p[user].card;
 75     for(int i=1;i<=p[user].num;i++)
 76     {
 77         if(u[i]||c[i]==3||c[i]==7)continue;
 78         if(c[i]==1){Peach_use_prol(user);continue;}
 79         if(c[i]==8){p[user].arm();u[i]=true;i=0;continue;}
 80         if((c[i]==2&&Can_use_kill(user))||(c[i]==4&&Can_duel(user))||(c[i]==5)||(c[i]==6))
 81         {
 82             u[i]=true;
 83             return c[i];
 84         }
 85     }
 86     return 0;
 87 }
 88 void Use(int user,int type)
 89 {
 90     if(type==2)Use_kill(user);
 91     if(type==4)Use_duel(user);
 92     if(type==5)Use_Sprq(user);
 93     if(type==6)Use_Ttaf(user);
 94     return ;
 95 }
 96 void Peach_use_prol(int user){if(p[user].Hp==4)return ;p[user].eat_peach();}
 97 bool Can_use_kill(int user)
 98 {
 99     int enemy=p[user].nxt;
100     if(p[user].nmk>=1&&!p[user].Wep)return false;
101     if(p[user].Mp)if((p[enemy].Apd&&p[enemy].aA)||p[enemy].LA){p[user].nmk++;return true;}
102     if(!p[enemy].Apd)return false;
103     if((p[enemy].aZ&&p[user].Ap)||(p[enemy].aA&&p[user].Zp)||(p[enemy].Mp&&p[user].Ap))
104     {
105         p[user].nmk++;
106         return true;
107     }
108     return false;
109 }
110 bool Can_duel(int user)
111 {
112     if(p[user].Ap)return true;
113     if(p[user].Zp)for(int i=p[user].nxt;i!=user;i=p[i].nxt)if(p[i].aA)return true;
114     if(p[user].Mp)for(int i=p[user].nxt;i!=user;i=p[i].nxt)if(p[i].LA||p[i].aA)return true;
115     return false;
116 }
117 void check(void){if(p[1].Hp<=0||!numA)Game_is_going_on=false;}
118 void Use_kill(int user)
119 {
120     int enemy=p[user].nxt;
121     Apear(user);
122     if(p[enemy].use_dodge())return ;
123     Cur(enemy,user,1);
124 }
125 void Use_duel(int user)
126 {
127     int enemy=Enyd(user);
128     if(user==1&&p[enemy].LA&&!p[enemy].Apd)return Cur(enemy,user,1);
129     Apear(user);
130     if(Nxkj(user,enemy))return ;
131     while(p[enemy].use_kill())std::swap(user,enemy);
132     Cur(enemy,user,1);
133     return ;
134 }
135 void Use_Sprq(int user)
136 {
137     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
138     {
139         if(Nxkj(user,i))continue;
140         if(p[i].use_kill())continue;Cur(i,user,1);
141         if(i==1&&!p[user].Apd)p[user].LA=true;
142     }
143 }
144 void Use_Ttaf(int user)
145 {
146     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
147     {
148         if(Nxkj(user,i))continue;
149         if(p[i].use_dodge())continue;
150         Cur(i,user,1);
151         if(i==1&&!p[user].Apd) p[user].LA=true;
152     }
153 }
154 void Apear(int user)
155 {
156     p[user].aM=p[user].Mp,p[user].aZ=p[user].Zp,p[user].aA=p[user].Ap;
157     p[user].LA=false,p[user].Apd=true;
158 }
159 void Cur(int user,int killer,int dlt)
160 {
161     p[user].Hp--;
162     if(p[user].Hp>0)return ;
163     while(p[user].Hp<=0&&p[user].eat_peach());
164     if(p[user].Hp<=0)
165         Die(user,killer);
166 }
167 int Enyd(int user)
168 {
169     if(p[user].Ap)return 1;
170     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
171         if((p[i].Apd&&p[i].aA)||((!p[i].Apd)&&p[i].LA&&p[user].Mp))
172             return i;
173 }
174 bool Nxkj(int user,int chr)
175 {
176     bool ansl;
177     if(!p[chr].Apd)return false;
178     int i=user;
179     ansl=false;
180     do{
181         if(Rlts(i,chr)&&p[i].use_nxkj()){Apear(i);return !Nxkj(i,anti(chr));}
182         i=p[i].nxt;
183     }while(i!=user);
184     return false;
185 }
186 bool Rlts(int usr_a,int U)
187 {
188     if((p[usr_a].Mp&&p[U].Mp)||(p[usr_a].Zp&&p[U].aZ)||(p[usr_a].Zp&&p[U].aM)||(p[usr_a].Mp&&p[U].aZ)||(p[usr_a].Ap&&p[U].aA))
189         return true;
190     return false;
191 }
192 void Die(int user,int killer)
193 {
194     p[user].dead=true;
195     p[p[user].lst].nxt=p[user].nxt;
196     p[p[user].nxt].lst=p[user].lst;
197     if(p[user].Ap){numA--;if(!numA)Game_end();for(int i=1;i<=3;i++)p[killer].Drw();}
198     if(p[user].Mp)Game_end();
199     if(p[user].Zp&&killer==1)p[1].clear();
200 }
201 void Game_end(void)
202 {
203     if(!numA) puts("MP");else puts("FP");
204     for(int i=1;i<=n;i++)p[i].print();exit(0);
205 }
206 int anti(int user){if(p[user].Ap)return 80;return 81;}
207 void print_it(int x)
208 {
209     if(x==1)printf("P ");
210     if(x==2)printf("K ");
211     if(x==3)printf("D ");
212     if(x==4)printf("F ");
213     if(x==5)printf("N ");
214     if(x==6)printf("W ");
215     if(x==7)printf("J ");
216     if(x==8)printf("Z ");
217 }
218 void Pig::Profile(char *a)
219 {
220     Hp=4;
221     if(a[1]=='M'){Mp=true;aM=true;Apd=true;}
222     if(a[1]=='Z')Zp=true;
223     if(a[1]=='F'){Ap=true;numA++;}
224 }
225 void Pig::Insert(int x){card[++num]=x;usd[num]=false;}
226 void Pig::New(void){nmk=0;}
227 void Pig::Drw(void){if(!top)top=1;Insert(hep[top--]);}
228 void Pig::arm(void){Wep=true;}
229 bool Pig::eat_peach(void)
230 {
231     if(Hp==4)return false;
232     for(int i=1;i<=num;i++)
233     if(usd[i]==0&&card[i]==1)
234     {if(Hp==4)return false;usd[i]=true;Hp++;return true;}
235     return false;
236 }
237 bool Pig::use_dodge(void)
238 {
239     for(int i=1;i<=num;i++)if(usd[i]==0&&card[i]==3){usd[i]=true;return true;}
240     return false;
241 }
242 bool Pig::use_kill(void)
243 {
244     for(int i=1;i<=num;i++)if(usd[i]==0&&card[i]==2){usd[i]=true;return true;}
245     return false;
246 }
247 bool Pig::use_nxkj(void)
248 {
249     for(int i=1;i<=num;i++) if(usd[i]==0&&card[i]==7){usd[i]=true;return true;}
250     return false;
251 }
252 void Pig::clear(void)
253 {
254     num=0,Wep=false;
255     memset(card,0,sizeof(card));memset(usd,0,sizeof(usd));
256 }
257 void Pig::print(void)
258 {
259     if(dead) printf("DEAD");
260     else for(int i=1;i<=num;i++)if(!usd[i])print_it(card[i]);
261     printf("\n");
262 }
263 void Pig::pro(void){if(Mp)printf("Mp ");if(Zp)printf("Zp ");if(Ap)printf("Ap ");}

猜你喜欢

转载自www.cnblogs.com/blog-Dr-J/p/9895487.html