C趣味編程百例(27)自動發(fā)牌

字號:

86.自動發(fā)牌
     一副撲克有52張牌,打橋牌時應將牌分給四個人。請設計一個程序完成自動發(fā)牌的工作。要求:黑桃用S(Spaces)表示;紅桃用H(Hearts)表示;方塊用D(Diamonds)表示;梅花用C(Clubs)表示。
    *問題分析與算法設計
     按照打橋牌的規(guī)定,每人應當有13張牌。在人工發(fā)牌時,先進行洗牌,然后將洗好的牌按一定的順序發(fā)給每一個人。為了便于計算機模擬,可將人工方式的發(fā)牌過程加以修改:先確定好發(fā)牌順序:1、2、3、4;將52張牌順序編號:黑桃2對應數(shù)字0,紅桃2對應數(shù)字1,方塊2對應數(shù)字2,梅花2對應數(shù)字3,黑桃3對應數(shù)字4,紅桃3對應數(shù)字5,...然后從52 張牌中隨機的為每個人抽牌。
     這里采用C語言庫函數(shù)的隨機函數(shù),生成0到51之間的共52個隨機數(shù),以產(chǎn)生洗牌后發(fā)牌的效果。
    *程序與程序注釋
    #include
    #include
    int comp(const void *j,const void *i);
    void p(int b[],char n[]);
    void main()
    {
     static char n[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
     int a[53],b1[13],b2[13],b3[13],b4[13];
     int b11=0,b22=0,b33=0,b44=0,t=1,m,flag,i;
     while(t<=52) /*控制發(fā)52張牌*/
     { m=random(52); /*產(chǎn)生0到51之間的隨機數(shù)*/
     for(flag=1,i=1;i<=t&&flag;i++) /*查找新產(chǎn)生的隨機數(shù)是否已經(jīng)存在*/
     if(m==a[i]) flag=0; /*flag=1:產(chǎn)生的是新的隨機數(shù)
     flag=0:新產(chǎn)生的隨機數(shù)已經(jīng)存在*/
     if(flag)
     {
     a[t++]=m; /*如果產(chǎn)生了新的隨機數(shù),則存入數(shù)組*/
     if(t%4==0) b1[b11++]=a[t-1]; /*根據(jù)t的模值,判斷當前*/
     else if(t%4==1) b2[b22++]=a[t-1]; /*的牌應存入哪個數(shù)組中*/
     else if(t%4==2) b3[b33++]=a[t-1];
     else if(t%4==3) b4[b44++]=a[t-1];
     }
     }
     qsort(b1,13,sizeof(int),comp); /*將每個人的牌進行排序*/
     qsort(b2,13,sizeof(int),comp);
     qsort(b3,13,sizeof(int),comp);
     qsort(b4,13,sizeof(int),comp);
     p(b1,n); p(b2,n); p(b3,n); p(b4,n); /*分別打印每個人的牌*/
    }
    void p(int b[],char n[])
    {
     int i;
     printf("\n\006 "); /*打印黑桃標記*/
     for(i=0;i<13;i++) /*將數(shù)組中的值轉(zhuǎn)換為相應的花色*/
     if(b[i]/13==0) printf("%c ",n[b[i]%13]); /*該花色對應的牌*/
     printf("\n\003 "); /*打印紅桃標記*/
     for(i=0;i<13;i++)
     if((b[i]/13)==1) printf("%c ",n[b[i]%13]);
     printf("\n\004 "); /*打印方塊標記*/
     for(i=0;i<13;i++)
     if(b[i]/13==2) printf("%c ",n[b[i]%13]);
     printf("\n\005 "); /*打印梅花標記*/
     for(i=0;i<13;i++)
     if(b[i]/13==3||b[i]/13==4) printf("%c ",n[b[i]%13]);
     printf("\n");
    }
    int comp(const void *j,const void *i) /*qsort調(diào)用的排序函數(shù)*/
    {
     return(*(int*)i-*(int*)j);
    }