正文

86.自动发牌2005-09-10 15:18:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/1736.html

分享到:

86.自动发牌注:本程序根据反映发现有点错,我调试了一下,只把语法错误改了一下(红色部分),至于逻辑错误,因为是转载的,我并不清楚现在又比较忙,所以没有更正。现在提供两个链接,或许对于理解问题有点帮助:http://bbs.cpcw.com/archiver/?tid-391664.html和http://cpcw.cnbbbs.com/tid-393278.html一副扑克有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<stdlib.h>#include<stdio.h>int comp(const void *j,const void *i);void p(int b[],char n[]); int main(void){    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=rand()%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); /*分别打印每个人的牌*/     return 0;} 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]%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调用的排序函数*/{    return(*(int*)i-*(int*)j);}  

阅读(8309) | 评论(4)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册