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 ");}