C趣味编程百例(27)自动发牌

文章作者 100test 发表时间 2007:03:10 17:35:39
来源 100Test.Com百考试题网


86.自动发牌
一副扑克有52张牌,打桥牌时应将牌分给四个人。请设计一个程序完成自动发牌的工作。要求:黑桃用S(Spaces)表示;红桃用H(Hearts)表示;方块用D(Diamonds)表示;梅花用C(Clubs)表示。
*问题分析与算法设计
按照打桥牌的规定,每人应当有13张牌。在人工发牌时,先进行洗牌,然后将洗好的牌按一定的顺序发给每一个人。为了便于计算机模拟,可将人工方式的发牌过程加以修改:先确定好发牌顺序:1、2、3、4;将52张牌顺序编号:黑桃2对应数字0,红桃2对应数字1,方块2对应数字2,梅花2对应数字3,黑桃3对应数字4,红桃3对应数字5,...然后从52 张牌中随机的为每个人抽牌。
这里采用C语言库函数的随机函数,生成0到51之间的共52个随机数,以产生洗牌后发牌的效果。
*程序与程序注释
#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) /*控制发52张牌*/
{ m=random(52). /*产生0到51之间的随机数*/
for(flag=1,i=1.i<=t&.&.flag.i ) /*查找新产生的随机数是否已经存在*/
if(m==a[i]) flag=0. /*flag=1:产生的是新的随机数
flag=0:新产生的随机数已经存在*/
if(flag)
{
a[t ]=m. /*如果产生了新的随机数,则存入数组*/
if(t%4==0) b1[b11 ]=a[t-1]. /*根据t的模值,判断当前*/
else if(t%4==1) b2[b22 ]=a[t-1]. /*的牌应存入哪个数组中*/
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 ) /*将数组中的值转换为相应的花色*/
if(b[i]/13==0) printf("%c ",n[b[i]]). /*该花色对应的牌*/
printf("\n\003 "). /*打印红桃标记*/
for(i=0.i<13.i )
if((b[i]/13)==1) printf("%c ",n[b[i]]).
printf("\n\004 "). /*打印方块标记*/
for(i=0.i<13.i )
if(b[i]/13==2) printf("%c ",n[b[i]]).
printf("\n\005 "). /*打印梅花标记*/

相关文章


考生是否必须通过第一(二)级才能报考第二(三)级?
C趣味程序百例(28)黑白子交换
C趣味编程百例(27)自动发牌
该考试每一级考试包括哪两部分?
Access计算机考试辅导第一章数据库基础知识9
全国计算机等级考试方兴未艾
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛