求高手帮忙写一个c语言发牌程序 50

一副扑克牌有52张牌,桥牌游戏中需要将牌分给4个人。使用c语言编写发牌程序,实现以下功能。(1)初始化52张牌(2)洗牌(3)发牌... 一副扑克牌有52张牌,桥牌游戏中需要将牌分给4个人。使用c语言编写发牌程序,实现以下功能。
(1)初始化52张牌
(2)洗牌
(3)发牌
展开
 我来答
鷹弈
推荐于2017-12-16 · TA获得超过5194个赞
知道大有可为答主
回答量:1257
采纳率:0%
帮助的人:616万
展开全部
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define PLAYER 4//玩家人数
#define NUM 13//玩家拿牌数
#define SIZE 52//所有牌数

//声明函数
void PokerRand(int *pokerRand);
void Palyer(int *pokerRand);
void Process(int *countA, int *countB, int *countC, int *countD);
void Output(int *poker, int *countA, int *countB, int *countC, int *countD);

struct PokerGame
{

int A[NUM];//记录玩家手中的黑桃牌
int B[NUM];//记录玩家手中的红桃牌
int C[NUM];//记录玩家手中的梅花牌
int D[NUM];//记录玩家手中的方片牌
int manNum[NUM];//记录玩家手里所有的牌

}man[PLAYER];

//随机产生52张牌
void PokerRand(int *pokerRand)
{
int i, j;

srand((unsigned)time(NULL));

for (i=0; i<SIZE; i++)
{
MARK: pokerRand[i] = rand()%52;
for (j=0; j<i; j++)
{
if (pokerRand[i] == pokerRand[j])
{
goto MARK;
}
}
}
}

//给4个玩家发牌
void Palyer(int *pokerRand)
{
int i, j;
int count = 0;

for (j=0; j<NUM; j++)
{
for (i=0; i<PLAYER; i++)//轮流发牌
{
man[i].manNum[j] = pokerRand[count++];
}
}
}

//统计玩家手中的牌
void Process(int *countA, int *countB, int *countC, int *countD)
{
int i, j;

for (i=0; i<PLAYER; i++)
{
countA[i] = 0;
countB[i] = 0;
countC[i] = 0;
countD[i] = 0;
for (j=0; j<NUM; j++)//统计四个玩家手中的牌
{
if ((man[i].manNum[j] >= 0) && (man[i].manNum[j] < 13))//黑桃
{
man[i].A[ countA[i]++ ] = man[i].manNum[j];
}
else if (man[i].manNum[j] < 26)//红桃
{
man[i].B[ countB[i]++ ] = man[i].manNum[j];
}
else if (man[i].manNum[j] < 39)//梅花
{
man[i].C[ countC[i]++ ] = man[i].manNum[j];
}
else//方片
{
man[i].D[ countD[i]++ ] = man[i].manNum[j];
}
}
}
}

//输出
void Output(int *poker, int *countA, int *countB, int *countC, int *countD)
{
int i, j;

printf("扑克牌自动发牌 %c(黑) %c(红) %c(梅) %c(方):\n", 6, 3, 5, 4);

for (i=0; i<PLAYER; i++)
{
printf("\n第%d人 :\n", i+1);//开始输出第i个玩家

printf("%c:\t", 6);//输出第i个玩家的黑桃牌
for (j=0; j<countA[i]; j++)
{
if (poker[ man[i].A[j] ] == 10)//假如等于10,以%d格式输出
{
printf("%4d", poker[ man[i].A[j] ]);
}
else//否则以%c格式输出
{
printf("%4c", poker[ man[i].A[j] ]);
}
}
printf("\n");

printf("%c:\t", 3);//输出第i个玩家的红桃牌
for (j=0; j<countB[i]; j++)
{
if (poker[ man[i].B[j] ] == 10)
{
printf("%4d", poker[ man[i].B[j] ]);
}
else
{
printf("%4c", poker[ man[i].B[j] ]);
}
}
printf("\n");

printf("%c:\t", 5);//输出第i个玩家的梅花牌
for (j=0; j<countC[i]; j++)
{
if (poker[ man[i].C[j] ] == 10)
{
printf("%4d", poker[ man[i].C[j] ]);
}
else
{
printf("%4c", poker[ man[i].C[j] ]);
}
}
printf("\n");

printf("%c:\t", 4);//输出第i个玩家的方片牌
for (j=0; j<countD[i]; j++)
{
if (poker[ man[i].D[j] ] == 10)
{
printf("%4d", poker[ man[i].D[j] ]);
}
else
{
printf("%4c", poker[ man[i].D[j] ]);
}
}
printf("\n");
}
}

void main(void)
{
int countA[PLAYER] = { 0 };//记录4个玩家持黑桃牌数
int countB[PLAYER] = { 0 };//记录4个玩家持红桃牌数
int countC[PLAYER] = { 0 };//记录4个玩家持梅花牌数
int countD[PLAYER] = { 0 };//记录4个玩家持方片牌数
int pokerRand[SIZE] = { 0 };//存放随机产生52张牌

int poker[SIZE] = {65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,};

PokerRand(pokerRand);//洗牌

Palyer(pokerRand);//发牌

Process(countA, countB, countC, countD);//整牌

Output(poker, countA, countB, countC, countD);//亮牌

printf("\n\n\n");

system("pause");
}
nopexx
2011-11-11 · TA获得超过306个赞
知道小有建树答主
回答量:598
采纳率:0%
帮助的人:606万
展开全部
自动发牌
一副扑克有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[]);
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) 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/13==0) printf("%c ",n[b%13]); /*该花色对应的牌*/
printf("\\n\\003 "); /*打印红桃标记*/
for(i=0;i<13;i++)
if((b/13)==1) printf("%c ",n[b%13]);
printf("\\n\\004 "); /*打印方块标记*/
for(i=0;i<13;i++)
if(b/13==2) printf("%c ",n[b%13]);
printf("\\n\\005 "); /*打印梅花标记*/
for(i=0;i<13;i++)
if(b/13==3||b/13==4) printf("%c ",n[b%13]);
printf("\\n");
}
int comp(const void *j,const void *i) /*qsort调用的排序函数*/
{
return(*(int*)i-*(int*)j);
}
追问
运行不了啊。???有很多错误
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Clor001
2011-11-11 · TA获得超过803个赞
知道小有建树答主
回答量:399
采纳率:0%
帮助的人:378万
展开全部
mark
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
QQ_351890267
2011-11-11 · 贡献了超过208个回答
知道答主
回答量:208
采纳率:0%
帮助的人:106万
展开全部
把要求说一下吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
过来问问你
2011-11-11 · TA获得超过1930个赞
知道小有建树答主
回答量:2742
采纳率:0%
帮助的人:1279万
展开全部
程序规则???
追问
一副扑克牌有52张牌,桥牌游戏中需要将牌分给4个人。使用c语言编写发牌程序,实现以下功能。
(1)初始化52张牌。
(2)洗牌
(3)发牌
程序运行效果如图
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式