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

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

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

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=0i<54i++)

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

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

{

flag=1

while(flag)

{

flag=0

card=rand()%54

for(j=0j<=ij++)

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

}

tank[i]=card

}

count=0

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

{

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=0i<16i++)

{

player[i]=tank[i]

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

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

}

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

last_four_card[i]=tank[53-i]

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

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

{

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

}

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

实现了2副牌的发牌,和每个人的牌和底牌

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#include<string.h>

struct CARD //牌

{

char suit[10] /*花色*/

char face[10] /*牌面*/

}

enum { posA, posB, posC, posD}//定义好每个人的位置

struct Postion

{

struct CARD getcard[25]//每人获得的牌

}

struct Postion postion[4]//分配四个位置

struct CARD leftCard[8]//底牌

struct CARD card[54]//54张牌

char *suit[]={"Spades","Hearts","Clubs","Diamonds"}

char *face[] = {"A","2","3","4","5","6","7","8","9",

"10","jack","Queen","King"}

/* 函数功能:将52张牌的顺序打乱,

函数参数:结构体数组wCard,表示52张牌

函数返回值:无

*/

void Shuffle(struct CARD *wCard)

{

inti,j

struct CARD temp

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

{

j=rand()%54

temp=wCard[i]

wCard[i]=wCard[j]

wCard[j]=temp

}

}

/*函数功能:发牌结果

函数参数:结构体数组wCard,表示有54张牌

函数返回值:无

*/

void Deal(struct CARD *wCard)

{

int i,aidx=0,bidx=0,cidx=0,didx=0

Shuffle(card)//将牌打乱

/*************发第一副牌,只发50张,分别分给A,B,C,D四个位置 4张留底**************/

// 第一次发完50张后,A,B多一张,所以下面第二次让C,D排在前面,两次发完刚好各40张*/

for (i=0i<50i++)//发牌数

{

// printf("%10s %5s\n", wCard[i].suit, wCard[i].face)

if(i%4==0)

postion[posA].getcard[aidx++]=wCard[i]

else if(i%4==1)

postion[posB].getcard[bidx++]=wCard[i]

else if(i%4==2)

postion[posC].getcard[cidx++]=wCard[i]

else if(i%4==3)

postion[posD].getcard[didx++]=wCard[i]

}

/**********剩下的四张作为底牌*********/

leftCard[0]=wCard[i++]

leftCard[1]=wCard[i++]

leftCard[2]=wCard[i++]

leftCard[3]=wCard[i++]

Shuffle(card)//再次将牌打乱

/*************发第二副牌,也只发50张,分别分给A,B,C,D四个位置,4张留底,一共8张底**************/

for (i=0i<50i++)//发牌数

{

// printf("%10s %5s\n", wCard[i].suit, wCard[i].face)

if(i%4==0)

postion[posC].getcard[cidx++]=wCard[i]

else if(i%4==1)

postion[posD].getcard[didx++]=wCard[i]

else if(i%4==2)

postion[posA].getcard[aidx++]=wCard[i]

else if(i%4==3)

postion[posB].getcard[bidx++]=wCard[i]

}

/**********剩下的四张作为底牌,这样就一共为8张底牌*********/

leftCard[4]=wCard[i++]

leftCard[5]=wCard[i++]

leftCard[6]=wCard[i++]

leftCard[7]=wCard[i++]

}

/* 函数功能:将52张牌按黑桃、红桃、草花、方块花色顺序,面值按A~K顺序排列

函数参数:结构体数组wCard,表示不同花色和面值的52张牌

指针数组wFace,指向面值字符串

指针数组wSuit,指向花色字符串

函数返回值:无

*/

void FillCard(struct CARD wCard[],char *wSuit[], char *wFace[])

{

int i

for (i=0i<52i++)

{

strcpy(wCard[i].suit, wSuit[i/13])

strcpy(wCard[i].face, wFace[i%13])

}

// wCard[53].face="Big" //大小王

strcpy(wCard[52].suit, "Small")

strcpy(wCard[52].face, "ghost")

strcpy(wCard[53].suit, "Big")

strcpy(wCard[53].face, "ghost")

}

void print(char ch)//输出牌

{

int i

switch(ch)

{

case 'A': for(i=0i<25i++)

{

printf("%10s %5s\n", postion[posA].getcard[i].suit, postion[posA].getcard[i].face)

}

break

case 'B': for(i=0i<25i++)

{

printf("%10s %5s\n", postion[posB].getcard[i].suit, postion[posB].getcard[i].face)

}

break

case 'C': for(i=0i<25i++)

{

printf("%10s %5s\n", postion[posC].getcard[i].suit, postion[posC].getcard[i].face)

}

break

case 'D': for(i=0i<25i++)

{

printf("%10s %5s\n", postion[posD].getcard[i].suit, postion[posD].getcard[i].face)

}

break

}

}

void outputLeftCard()//输出底牌

{

int i

for(i=0i<8i++)

printf("%10s %5s\n", leftCard[i].suit, leftCard[i].face)

}

int main()

{

char pos

srand(time(NULL))

FillCard(card,suit,face)

//Shuffle(card)

Deal(card)

printf("Please choose your position(A、B、C、D):")

scanf("%c", &pos)

print(pos)//输出你所在位置的牌

/**********下面输出的是,除了你之外其他人的牌**********/

if(pos !='A')

{

printf("A:\n")

print('A')

}

if(pos !='B')

{

printf("B:\n")

print('B')

}

if(pos !='C')

{

printf("C:\n")

print('C')

}

if(pos !='D')

{

printf("D:\n")

print('D')

}

printf("底牌为:\n")

outputLeftCard()//输出底牌

return 0

}

因为不熟练,可以试试以下方法

扑克牌洗牌手法如下:

1、在洗牌时,左右手各得一半牌,手臂掌在桌面上,左右手牌前端保持着一定距离,然后左右手的牌相互交错落下,待所有牌落下后,再用双手把牌向中部推齐,之后重复几次该动作就可以了。

2、在收牌时最好是用双手,把你想要的牌合拼在一起,收在牌叠底部,为避免别人有意或无意看见底牌,在得知结果后引起怀疑,最好在最底的一牌就是杂牌,整副牌收好后放在台上,然后右手从面上拿起约五分之三的牌。

3、接着是正式洗牌,代牌的动作姿势有多种,其中较普遍的有内弯放牌和外弯放牌,可选择交错式洗牌的技巧用于洗牌。而且在洗牌途中,为了防止其他人有意或无意看到,底牌一般用杂牌替代,在快洗完牌时,再上下交替牌的位置,使其牌下的小部分转化在牌上部,这样就可避免其他人看到牌数的大小。


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

原文地址: http://www.outofmemory.cn/yw/8452482.html

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

发表评论

登录后才能评论

评论列表(0条)

保存