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张牌!!!