
#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语言 洗牌问题!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)