
#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
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)