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);
}
一副撲克有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);
}