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

字號:

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