C语言自动发牌程序代码解析

问题描述

一副扑克有52张牌,打桥牌时应将牌分给4个人。请设计一个程序完成自动发牌的工作。要求:黑桃用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张牌中随机为每个人抽牌。

下面是完整的代码:

#include<stdio.h> 
#include<stdlib.h> 
#include<time.h>
 
int main()
{
    int a[60];
    int b[60];
    int w = 0;
    int wi,wj,wii;
    int i,j,index,x=0,m;
    for(i=0;i<54;i++)
        a[i]=i+1;
    srand((unsigned)time(0));
    for(i=0;i<54;)
    {
        index=rand()%54;
        if(a[index]!=0)
        {
            b[i]=a[index];
            //printf("%d ",b[i]);
            a[index]=0;
            ++i;
        }
    }
    printf("\n说明:\n");
    printf("*******************\n");
    printf("**    红桃 %c    ",3);
    printf("**\n");
    printf("**    方块 %c    ",4);
    printf("**\n");
    printf("**    梅花 %c    ",5);
    printf("**\n");
    printf("**    黑桃 %c    ",6);
    printf("**\n");
    printf("**    大王 A    **\n**    小王 a    **\n");
    printf("*******************\n");
    printf("\n请输入打牌人数:\n");
    scanf("%d",&w);
    wi = 54/w;
    wj = 54%w;
    //printf("%d,%d",wi,wj);
    for (j = 0;j < w;j++)
    {
        m = 0;
        printf("\n\n第%d个人的牌\n",j+1);
        wj --;
        if (wj>=0)
            wii = wi + 1;
        else
            wii = wi;
 
        //红桃
        printf("红桃 %c ",3);
        printf(":");
        for(i = j*wii;i<(j+1)*wii;i++)
        {
            if (b[i]<=13&&b[i]>0)
            {
                m++;
                if (b[i]==11)
                    printf("J ");
                else if (b[i]==12)
                    printf("Q ");
                else if (b[i]==13)
                    printf("K ");
                else
                printf("%d ",b[i]);
            }
        }
 
       
        //方块
        printf("\n方块 %c ",4);
        printf(":");
        for(i = j*wii;i<(j+1)*wii;i++)
        {
            if (b[i]<=26&&b[i]>13)
            {
                m++;
                b[i] = b[i]-13;
                if (b[i]==11)
                    printf("J ");
                else if (b[i]==12)
                    printf("Q ");
                else if (b[i]==13)
                    printf("K ");
                else
                printf("%d ",b[i]);
            }
        }
 
        //梅花
        printf("\n梅花 %c ",5);
        printf(":");
        for(i = j*wii;i<(j+1)*wii;i++)
        {
           
            if (b[i]<=39&&b[i]>26)
            {
                m++;
                b[i] = b[i]-26;
                if (b[i]==11)
                    printf("J ");
                else if (b[i]==12)
                    printf("Q ");
                else if (b[i]==13)
                    printf("K ");
                else
                printf("%d ",b[i]);
            }
        }
        //黑桃
        printf("\n黑桃 %c ",6);
        printf(":");
        for(i = j*wii;i<(j+1)*wii;i++)
        {
            if (b[i]<=52&&b[i]>39)
            {
                m++;
                b[i] = b[i]-39;
                if (b[i]==11)
                    printf("J ");
                else if (b[i]==12)
                    printf("Q ");
                else if (b[i]==13)
                    printf("K ");
                else
                printf("%d ",b[i]);
            }
        }
        //大小王
        printf("\n大小王 A or a :");
        for(i = j*wii;i<=(j+1)*wii;i++)
        {
            if (b[i]==53)
            {
                m++;
                printf("A ");
            }
            if (b[i]==54)
            {
                m++;
                printf("a ");
            }
        }
        printf("\n总共:%d张牌!!!\n",m);
    }
   
}

2个人分牌的测试结果

说明:
*******************
**    红桃     **
**    方块     **
**    梅花      **
**    黑桃     **
**    大王 A    **
**    小王 a    **
*******************

请输入打牌人数:
2


第1个人的牌
红桃 :3 7 5 4 Q 10
方块 :Q K 2 10 8 J 1
梅花  :Q 8 7 6 1 K 5
黑桃 :6 4 Q 10 1
大小王 A or a :A a
总共:27张牌!!!


第2个人的牌
红桃 :8 2 K J 6 1 9
方块 :5 4 3 6 7 9
梅花  :4 2 3 10 J 9
黑桃 :J 2 5 9 7 K 3 8
大小王 A or a :
总共:27张牌!!!

C语言自动发牌程序代码解析

相关推荐