编写C语言程序,模拟将一副扑克牌54张随机分给4个人 (如何表达不同花色和大小,如何高效洗牌)

编写C语言程序,模拟将一副扑克牌54张随机分给4个人 (如何表达不同花色和大小,如何高效洗牌),第1张

#include <stdioh>

#include <stdlibh>

#include <timeh>

int main()

{

int poke[13][4],joker[2],last_four_card[4]; //定义四类十三张牌、双王

int i,j,card,count,tank[54],player[20],computer[2][20];

bool flag;

srand(time(NULL)); //初始化随机种子

for(i=0;i<54;i++)

tank[i]=-1; //初始化容器

for(i=0;i<54;i++)

{

flag=1;

while(flag)

{

flag=0;

card=rand()%54;

for(j=0;j<=i;j++)

if(card==tank[j]) flag=1;

}

tank[i]=card;

}

count=0;

for(i=0;i<54;i++)

{

if(tank[i]==52) printf("jok ");

else if(tank[i]==53) printf("JOK ");

else if(tank[i]%13==0) printf("%c%c ",tank[i]/13+3,'A');

else if(tank[i]%13==10) printf("%c%c ",tank[i]/13+3,'J');

else if(tank[i]%13==11) printf("%c%c ",tank[i]/13+3,'Q');

else if(tank[i]%13==12) printf("%c%c ",tank[i]/13+3,'K');

else if(tank[i]%13<10) printf("%c%-2d ",tank[i]/13+3,tank[i]%13+1);

count++;

if(count%20==0) printf("\n");

}

count=0;

for(i=0;i<16;i++)

{

player[i]=tank[i];

computer[0][i]=tank[i+16];

computer[1][i]=tank[i+32];

}

for(i=0;i<4;i++)

last_four_card[i]=tank[53-i];

printf("\n\n你的牌是:\n\n");

for(i=0;i<16;i++)

{

if(player[i]==52) printf("jok ");

else if(player[i]==53) printf("JOK ");

else if(player[i]%13==0) printf("%c%c ",player[i]/13+3,'A');

else if(player[i]%13==10) printf("%c%c ",player[i]/13+3,'J');

else if(player[i]%13==11) printf("%c%c ",player[i]/13+3,'Q');

else if(player[i]%13==12) printf("%c%c ",player[i]/13+3,'K');

else if(player[i]%13<10) printf("%c%-2d ",player[i]/13+3,player[i]%13+1);

count++;

if(count%20==0) printf("\n");

}

getchar();

getchar();

return 0;

}

以前无聊写的 给你作参考吧

这种小case也能上竞赛的门面上?这个问题其实很简单的啊,就只要三个函数而已。一个函数对应一种模式,扑克牌的四种花色可以用四个数组来表示,每个数组13张,再加大小王。(或者更简单的你直接都放在一个数组里。)第一个函数:随机产生四个随机数然后根据这些数字显示对应的值即可。第二个: 先产生27个随机数输出,然后在输出剩下的27张。第三个: 复制一下前面的数组,也是对应的就行。

程序免看了,这我里有一个类似的,你有兴趣的话参照一下

#include <stdlibh>

#include <stdioh>

#include <timeh>

int main()

{

int i,j,temp,count=0; //控制变量 此处的count没有实际意义,用于统计随机共进行了几次

int card[52]={0}; //将抽到的牌号按顺序放

int color[52]={0}; //将抽到的牌花色按顺序放

int JUD[4][13]={0}; //要据其花色和牌号在数组中定位,可以确定其唯一性

srand(time(NULL)); //根据时间的随机

i=j=0; //初始化

while(i<52) //需要52轮有效的产生数

{

count++;

j=rand()%13; //产生牌号

temp=rand()%4; //产生花色

if(JUD[temp][j]==-1) //根据数组确定其惟一性,若已产生则作废,重新开始

continue;

JUD[temp][j]=-1; //若有效,标记为-1

card[i]=j; //记下此轮中的牌号

color[i]=temp; //记下此轮中牌的花色

i++; //进入下一次分牌

}

i=j=0; //重新初始化

while(i<4) //此处为分给四个人

{

j=0; //必须置1

while(j<52) //小于总数量

{

if(j%4==i) //分给第i个人

{

if(color[j]==0) //找出花色

printf("红");

else if(color[j]==1)

printf("黑");

else if(color[j]==2)

printf("方");

else

printf("梅");

if(card[j]==0) //找出牌号

printf("K ");

else if(card[j]==1)

printf("A ");

else if(card[j]==11)

printf("J ");

else if(card[j]==12)

printf("Q ");

else

printf("%d ",card[j]);

}

j++;

}

i++;

printf("\n");

}

printf("%d\n",count);

return 0;

}

#include <timeh>

#include <stdioh>

#include <conioh>

#include <stdlibh>

#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");

}

定义一个结构类型表示一张牌,结构包含3个成员,第一个成员char:取值2,3~K,A表示牌名字,第二个成员int:取值2~14表示牌真实大小。第三个成员:结构链表指针。

写一个初始化函数,定义52大小的结构数组,成员值初值分别和牌对应,遍历数组并将每个元素的链表指针依次指向下一个元素地址。这样得到一个初始链表。(相当于一盒新牌)

所有涉及随机数都用rand函数,洗牌分四份就是循环取随机数m=1~n,n是随循环自减,初值52,直到n变成0。每随一次循环就从初始链表中遍历取出对应第m个节点,并从初始链表中将这个节点断开(既前一个节点指针直接指向后一个节点指针)。每取13张就组成一个新的链表。这样获得4个新链表分别表示4个玩家。

最后出牌就是分别遍历自己的链表,利用循环取牌比较结构数值大小。(取出的牌要从链表断开和上面一样,你把取出节点写成独立函数就能反复使用)。

以上就是关于编写C语言程序,模拟将一副扑克牌54张随机分给4个人 (如何表达不同花色和大小,如何高效洗牌)全部的内容,包括:编写C语言程序,模拟将一副扑克牌54张随机分给4个人 (如何表达不同花色和大小,如何高效洗牌)、c语言 洗牌问题 求挑错、c语言 洗牌问题!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9475311.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存