编写一个C语言程序,模拟洗牌和发牌的过程

编写一个C语言程序,模拟洗牌和发牌的过程,第1张

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

struct POKER

{

int num // A:1 , J:11 , Q:12 , K:13

int color //黑1,红2,梅3,方4

}s[52]

int main()

{

int i,num,color

memset(s,0,sizeof(struct POKER)*52)

srand((unsigned)time(0))

int count=0

while(count<52)

{

num=rand()%13+1

color=rand()%4+1

int flag_skip=0,flag_end=0

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

{

if(s[i].num==num && s[i].color==color)

{

flag_skip=1

break

}

}

if(flag_skip==1)

{

continue

}

while(1)

{

i=rand()%52

if(s[i].num==0)

{

s[i].num=num

s[i].color=color

count++

break

}

else

{

continue

}

}

}

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

{

if(i%13==0)

{

printf("\n玩家%d : ",i/13+1)

}

switch(s[i].num)

{

case 1: putchar('A')break

case 11: putchar('J')break

case 12: putchar('Q')break

case 13: putchar('K')break

default: printf("%d",s[i].num)

}

switch(s[i].color)

{

case 1: putchar(6)break

case 2: putchar(3)break

case 3: putchar(5)break

case 4: putchar(4)break

default: printf(" ")

}

printf(" ")

}

return 0

}

分类: 电脑/网络 >>程序设计 >>其他编程语言

解析:

用随机函数来模拟比较合适

扑克牌有54张,可以先约定好,比如:

大猫----------0

小猫----------1

黑桃A---------1

黑桃2---------黑桃A + 1

黑桃3---------黑桃A + 2

...

黑桃K---------黑桃A + 12

红心A---------黑桃A + 13

红心2---------红心A + 1

...

这样就可以把整副扑克牌的每张牌用一个特定的整数来表示,它们之间的大小关系可以通过不同的玩法制定相应的规则。

那好,现在我们定义一副牌int Joker[54]

用随机函数来填充Joker。

算法为:(不是真实的程序语言,由于不知道你使用什么编程语言,这里只描述算法)

for(i = 0 to 53)

{

l1:

生成随机数:pai = rand(54)随机生成一个0 -- 53的整数

在已产生的牌中查找是否存在pai(即在Joker[0] 到Joker[i - 1]中查找)

如果存在,goto l1;

否则Joker[i] = pai

}

这样我们就把整副牌给洗好了。

接下来,就可以发牌了。

发牌时,只要按顺序把牌“发”到每个人的“手”里就行了

例如:4个人玩牌,四个人的牌为player[4][14]

for(i = 0 to 53)

{

player[i % 4][i / 4] = Joker[i]

}

这样就完成了发牌程序。

当然,如果你想要发牌也用一维数组,那也简单,比如还是4个人玩,那么:

player0手上的第n张牌就是Joker[n * 4 + 0]

player1手上的第n张牌就是Joker[n * 4 + 1]

player2手上的第n张牌就是Joker[n * 4 + 2]

player3手上的第n张牌就是Joker[n * 4 + 3]

好了,洗牌和发牌都已经完成,剩下就是如何玩牌了,你没问,就不多说了。

上面的伪代码应该能看懂吧?如果有问题,就用消息联系好了。你自己用编程语言去实现,不是什么大问题的。

实现了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

}


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

原文地址:https://54852.com/yw/11810378.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存