签到

06月21日
尚未签到

共有回帖数 0

    顾我心安

    等级:
    ◣我重发~~~◥:人机对战扑克游戏,详情请进
    /**********************13cards.c开始******************/
    /*将以下代码保存为 13cards.c*/
    #include "showcrds.c"
    #include "pokerAI.c"
    #include "menu.c"
    #include graphics.h
    #include stdlib.h

    typedef struct{
     unsigned char num;
     unsigned char style;
    }Poker;
    typedef struct{
     unsigned char num;
     unsigned char style;
     unsigned char status;
    }PokerPL;

    Poker allPoker[53]={{3,1},{4,1},{5,1},{6,1},{7,1},{8,1},{9,1},
           {10,1},{11,1},{12,1},{13,1},{14,1},{15,1},
           {3,2},{4,2},{5,2},{6,2},{7,2},{8,2},{9,2},
           {10,2},{11,2},{12,2},{13,2},{14,2},{15,2},
           {3,3},{4,3},{5,3},{6,3},{7,3},{8,3},{9,3},
           {10,3},{11,3},{12,3},{13,3},{14,3},{15,3},
           {3,4},{4,4},{5,4},{6,4},{7,4},{8,4},{9,4},
           {10,4},{11,4},{12,4},{13,4},{14,4},{15,4},{0,0}};

    Poker deskTopPoker[53];
    Poker cpuPoker[3][14];
    PokerPL playerPoker[14];
    Poker currentPokers[14];

    void pokerToStr(Poker *p,unsigned char *str);
    void drawCurrent(int player);
    void washPokers(int flag);
    void devide4(void);
    void initGrphErrExit(void);
    void updateCpus(int index);
    void updatePlayer(int flag,int current);
    void updateCrntPoker(void);
    void updateDsktpPk(void);
    void addTodeskTop(Poker p);
    int game(int player);
    void drawCurrent(int player);
    int turnToCpus(int index,int *flag);
    int getPeriod(int playerIndex);
    int turnToPlayer(int *flag);
    void pokerToStr(Poker p[],unsigned char *str);
    int getCountP(Poker p[]);
    int getCountPL(void);
    void msg(int winner);
    void main(void);

    void washPokers(int flag){
     Poker washTmp;
     int i;
     int m,n;
     if(flag==0) randomize();
     for(i=0;i5000;i++){
       m=random(52);
       n=random(52);
       washTmp=allPoker[m];
       allPoker[m]=allPoker[n];
       allPoker[n]=washTmp;
     }
     currentPokers[0].num=0;
     for(i=0;i52;i++)
       deskTopPoker.num=0;
     cpuPoker[2][0].num=0;
     cpuPoker[1][0].num=0;
     cpuPoker[0][0].num=0;
     playerPoker[0].num=0;
    }

    void devide4(void){
     int i,tmp,j;
     PokerPL swapTmp;
     int pa=0,pb[3]={0,0,0};
     for(i=0;i52;i++){
       if(i%4==0){
         playerPoker[pa].num=allPoker.num;



         playerPoker[pa].style=allPoker.style;
         playerPoker[pa].status=0;
         pa++;
       }
       else{
         tmp=(i%4)-1;
         cpuPoker[tmp][pb[tmp]]=allPoker;
         pb[tmp]++;
       }
     }
     playerPoker[13].num=0;
     playerPoker[13].status=0;
     cpuPoker[0][13].num=0;
     cpuPoker[1][13].num=0;
     cpuPoker[2][13].num=0;
     currentPokers[0].num=0;
     deskTopPoker[0].num=0;
     for(j=0;j13;j++){
       for(i=0;i12-j;i++){
         if(playerPoker.numplayerPoker[i+1].num){
           swapTmp=playerPoker;
           playerPoker=playerPoker[i+1];
           playerPoker[i+1]=swapTmp;
         }
       }
     }
    }


    void initGrphErrExit(void){
     int gd=VGA,gm=VGAHI,errorcode;

     /*registerbgidriver(EGAVGA_driver);*/
     initgraph(&gd,&gm,"");
     errorcode=graphresult();
     if (errorcode != grOk)
     {
       printf("nGraphics error: %sn",grapherrormsg(errorcode));
       printf("nI am sorry that an error occurred(in initgraph).nn");
       printf("ttPress any key to exit...");
       getch();
       exit(0);
     }
    }

    void updateCpus(int index){
     int i;
     switch(index){
       case 0:
         setfillstyle(SOLID_FILL,GREEN);
         bar(560,50,636,412);
         setcolor(LIGHTBLUE);
         outtextxy(565,50,"Bill");
         for(i=0;cpuPoker[index].num != 0;i++)
           showCard(563,i*21+60,0,0);
         break;
       case 1:
         setfillstyle(SOLID_FILL,GREEN);
         bar(140,0 ,482,100);
         setcolor(RED);
         outtextxy(55,4,"Wen Xichang");
         for(i=0;cpuPoker[index].num != 0;i++)
           showCard(i*22+144,2,0,0);
         break;
       case 2:
         setfillstyle(SOLID_FILL,GREEN);
         bar(2,50,76,412);



         setcolor(YELLOW);
         outtextxy(5,50,"Computer");
         for(i=0;cpuPoker[index].num != 0;i++)
           showCard(5,i*21+60,0,0);
         break;
     }
    }
    void updatePlayer(int flag,int current){
     static old=20;
     int i;
     int x,y;
     if(old==20){
       setfillstyle(SOLID_FILL,GREEN);
       for(i=0;i13;i++) bar(149+i*22,462,167+i*22,477);
     }
     else{
       setfillstyle(SOLID_FILL,GREEN);
       bar(149+old*22,462,167+old*22,477);
     }

     logo(149+current*22,462,48,COPY_PUT);
     old=current;
     if(flag != 0){
       setfillstyle(SOLID_FILL,GREEN);
       bar(147,342,481,363);
       bar(147,439,481,460);
       for(i=0;i13;i++){
         if(playerPoker.num != 0){
           if(playerPoker.status==0)
             showCard(147+i*22,364,playerPoker.num,playerPoker.style);
           else
             showCard(147+i*22,342,playerPoker.num,playerPoker.style);
         }
         else {
           setfillstyle(SOLID_FILL,GREEN);
           bar(196+i*22,342,481,460);
           break;
         }
       }
     }
    }

    void updateCrntPoker(void){
     int i;
     setfillstyle(SOLID_FILL,GREEN);
     bar(226,231,512,330);
     for(i=0;currentPokers.num != 0;i++)
       showCard(229+i*15,232,currentPokers.num,currentPokers.style);
    }

    void updateDsktpPk(void){
     int i;
     setfillstyle(SOLID_FILL,GREEN);
     bar(140,102,512,230);
     for(i=0;deskTopPoker.num != 0;i++){
       if(i26) showCard(141+i*12,103,deskTopPoker.num,deskTopPoker.style);
       else showCard(141+(i-26)*12,133,deskTopPoker.num,deskTopPoker.style);
     }
    }

    void addTodeskTop(Poker p){
     int i=0;
     for(;;){
       if(deskTopPoker.num==0) break;
       i++;
     }
     deskTopPoker=p;
     if(i26) showCard(141+i*12,103,deskTopPoker.num,deskTopPoker.style);
     else showCard(141+(i-26)*12,133,deskTopPoker.num,deskTopPoker.style);



    }

    int game(int player){
     int tmp=0,i;
     int playerTurn;
     unsigned char tmp1[14];
     unsigned char tmp2[14];
     int jump;
     
     setfillstyle(SOLID_FILL,GREEN);
     bar(0,0,639,479);
     
     washPokers(1);
     devide4();
     updateCpus(0);
     updateCpus(1);
     updateCpus(2);
     updatePlayer(1,0);
     
     playerTurn=player;
     jump=player;
     
     for(;;){
       switch(jump){
         case 3:
           AAAA:
           drawCurrent(3);
           tmp=turnToPlayer(&playerTurn);
           switch(tmp){
             case 20:
               switch(inMenu(3)){
                 case 2:
                   return 4;
                 case 1:
                 case 0:
                   updateDsktpPk();
                   updateCrntPoker();
                   goto AAAA;
                 case 3:
                   closegraph();
                   exit(0);
               }
               break;
             case 10:
               return 3;
           }
           if(tmp != 0){
             sleep(1);
             for(i=0;currentPokers.num != 0;i++)
               addTodeskTop(currentPokers);
           }
           jump=0;
           break;



         case 0:  
           drawCurrent(0);
           tmp=turnToCpus(0,&playerTurn);
           if(tmp != 0){
             sleep(1);
             for(i=0;currentPokers.num != 0;i++)
               addTodeskTop(currentPokers);
           }
           if(tmp==10)
             return 0;
           jump++;  
           break;  
           case 1:
           drawCurrent(1);
           tmp=turnToCpus(1,&playerTurn);
           if(tmp != 0){
             sleep(1);
             for(i=0;currentPokers.num != 0;i++)
               addTodeskTop(currentPokers);
           }
           if(tmp==10)
             return 1;
           
           jump++;
           break;  
         case 2:  
           drawCurrent(2);
           tmp=turnToCpus(2,&playerTurn);
           
           if(tmp != 0){
             sleep(1);
             for(i=0;currentPokers.num != 0;i++)
               addTodeskTop(currentPokers);
           }
             
           if(tmp==10)
             return 2;
           jump++;
           break;
       }
     }
    }

    void drawCurrent(int player){
     setcolor(GREEN);
     line(20,23,52,23);
     line(20,23,36,44);
     line(36,44,52,23);
     
     line(112,34,133,50);
     line(112,34,112,66);



     line(133,50,112,66);

     line(578,19,610,19);
     line(578,19,594,40);
     line(610,19,594,40);
     
     line(107,398,107,430);
     line(107,398,128,414);
     line(107,430,128,414);
     
     line(144,101,478,101);
     line(559,55,559,403);
     line(79,55,79,403);
     setcolor(YELLOW);
     switch(player){
       case 0:
         line(578,19,610,19);
         line(578,19,594,40);
         line(610,19,594,40);
         line(559,55,559,403);
         break;
       case 1:
         line(112,34,133,50);
         line(112,34,112,66);
         line(133,50,112,66);
         line(144,101,478,101);
         break;
       case 2:
         line(20,23,52,23);
         line(20,23,36,44);
         line(36,44,52,23);
         line(79,55,79,403);
         break;
       case 3:
         line(107,398,107,430);
         line(107,398,128,414);
         line(107,430,128,414);
     }
    }
       

    int turnToCpus(int index,int *flag){
     unsigned char tmp1[14],ind[14],tmp2[14];
     int i,j;

     if(*flag==index){
       pokerToStr(cpuPoker[index],tmp1);
       AIout(tmp1,ind,getPeriod(index));
       for(i=0;i14;i++){
         if(ind==255) break;
         currentPokers=cpuPoker[index][ind];
         cpuPoker[index][ind].num=0;
         cpuPoker[index][ind].style=0;
       }
       currentPokers.num=0;
       *flag=index;
       for(i=0;i14;i++){
         if(cpuPoker[index].num==0){
           for(j=i+1;j14;j++){
             if(cpuPoker[index][j].num != 0){
               cpuPoker[index]=cpuPoker[index][j];
               cpuPoker[index][j].num=0;
               cpuPoker[index][j].style=0;
               break;
             }



           }
         }
       }
       updateCpus(index);
       updateCrntPoker();
       if(getCountP(cpuPoker[index])==0) return 10;
       return 1;
     }
     else{
       pokerToStr(cpuPoker[index],tmp1);
       pokerToStr(currentPokers,tmp2);
         if(getType(tmp2)==0)
           printf("!!!!");
       if(AIeat(tmp1,tmp2,ind,getPeriod(index)) != 0){
         for(i=0; i14;i++){
           if(ind==255) break;
           currentPokers=cpuPoker[index][ind];
           cpuPoker[index][ind].num=0;
           cpuPoker[index][ind].style=0;
         }
         currentPokers.num=0;
         *flag=index;
         for(i=0;i14;i++){
           if(cpuPoker[index].num==0){
             for(j=i+1;j14;j++){
               if(cpuPoker[index][j].num != 0){
                 cpuPoker[index]=cpuPoker[index][j];
                 cpuPoker[index][j].num=0;
                 cpuPoker[index][j].style=0;
                 break;
               }
             }
           }
         }
         updateCpus(index);
         updateCrntPoker();
         if(getCountP(cpuPoker[index])==0) return 10;
         return 1;
       }
       return 0;
     }
    }

    int getPeriod(int playerIndex){
     int num[4],sum;
     num[0]=getCountP(cpuPoker[0]);
     num[1]=getCountP(cpuPoker[1]);
     num[2]=getCountP(cpuPoker[2]);
     num[3]=getCountPL();
     if(num[playerIndex+1]2||num[playerIndex]3) return 4;
     sum=num[0]+num[1]+num[2]+num[3];
     if(sum40) return 1;
     if(sum26) return 2;
     return 3;
    }
    int turnToPlayer(int *flag){


     int key=0;
     int i,j,t;
     static int hand=0;
     unsigned char tmp1[14],tmp2[14],tmp3[14],tmp4[14];
     Poker tmpP[14],tmpQ[14];
     for(;;){
       if (bioskey(1))
         key=bioskey(0);
       else
         key=0;

       switch(key){
         case LEFT:
           hand=((hand1)?(getCountPL()-1): (hand-1));
           updatePlayer(0,hand);
           break;
         case RIGHT:
           hand=((hand = (getCountPL()-1))?0 : (hand+1));
           updatePlayer(0,hand);
           break;
         case UP:
           if(playerPoker[hand].num2&&playerPoker[hand].num16){
             playerPoker[hand].status=1;
             updatePlayer(1,hand);
           }
           break;
         case DOWN:
           playerPoker[hand].status=0;
           updatePlayer(1,hand);
           break;
         case ENTER:
         case SPACE:
           i=0;
           for(j=0;j14;j++){
             if(playerPoker[j].status==1){
               tmpP.num=playerPoker[j].num;
               tmpP.style=playerPoker[j].style;
               playerPoker[j].status=0;
               i++;
             }
           }
           tmpP.num=0;
           pokerToStr(tmpP,tmp1);

           if(*flag != 3){
             pokerToStr(currentPokers,tmp2);
             for(i=0;i14;i++)
               tmpQ.num=playerPoker.num;

             pokerToStr(tmpQ,tmp3);



           if(AIeat(tmp3,tmp2,tmp4,1)==0) return 0;
             t=getType(tmp1);
             if(t!=4){
               if((getType(tmp2) != t)||(t==0)||
                 (getSmall(tmp2)=getSmall(tmp1))){
                 updatePlayer(1,hand);
                 break;
               }
             }
             else{
               if((getType(tmp2) == 4)&&
                 (getSmall(tmp2)=getSmall(tmp1))){
                 updatePlayer(1,hand);
                 break;
               }
             }
           }
           else{
             if(getType(tmp1)==0){
               updatePlayer(1,hand);
               break;
             }
           }

           for(i=0;tmpP.num != 0;i++){
             for(j=0;j14;j++){
               if(tmpP.num==playerPoker[j].num&&
                 tmpP.style==playerPoker[j].style){
                 playerPoker[j].num=0;
                 playerPoker[j].style=0;
                 currentPokers=tmpP;
               }
             }
           }
           currentPokers.num=0;
           for(i=0;i14;i++){
             if(playerPoker.num==0){



        for(j=i+1;j14;j++){
                 if(playerPoker[j].num != 0){
                   playerPoker=playerPoker[j];
                   playerPoker[j].num=0;
                   playerPoker[j].style=0;
                   break;
                 }
               }
             }
           }
           hand=0;
           updatePlayer(1,hand);
           updateCrntPoker();
           *flag=3;
           if(getCountPL()==0) return 10;
           return 1;
         case ESC:
           return 20;
       }
     }
    }


    void pokerToStr(Poker p[],unsigned char *str){
     int i,j=0;
     for(i=0;i14;i++){
       if(p.num != 0){
         *(str+j)=(char)(p.num);
         j++;
       }
       else break;
     }
     *(str+j)=0;
    }

    int getCountP(Poker p[]){
     int i=0;
     for(;;){
       if(p.num==0) break;
       i++;
     }
     return i;
    }

    int getCountPL(void){
     int i=0;
     for(;;){
       if(playerPoker.num==0) break;
       i++;
     }
     return i;
    }

    void msg(int winner){
     setfillstyle(SOLID_FILL,9);
     bar(204,152,427,285);
     dBorder(204,152,427,285);
     paintLogo(4);
     setcolor(WHITE);
     outtextxy(246,189,"WINNER:");
     setcolor(BLUE);
     settextstyle(0,0,2);
     switch(winner){
       case 0:
         outtextxy(230,211,"Bill Gates");
         break;
       case 1:
         outtextxy(230,211,"Wen Xichang");
         break;
       case 2:
         outtextxy(230,211,"Computer");
         break;
       default:
         outtextxy(230,211,"YOU !!!");
     }
     settextstyle(0,0,0);
     setcolor(GREEN);
     outtextxy(260,257,"Press ENTER ...");
     
     while(getch() != 13);
     setfillstyle(SOLID_FILL,GREEN);
     bar(204,152,427,285);
    }

    void main(void){
     int key;
     int winner=3;
     
     initGrphErrExit();
     inMenu(1);
     washPokers(0);
     for(;;){
       winner=game(winner);
       if(winner==4){
         inMenu(1);
         winner=3;
       }
       else
         msg(winner);
     }
    }
    /**********************13cards.c结束******************/


    楼主 2016-03-16 17:45 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知