
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#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=0i<SIZEi++)
{
MARK:pokerRand[i] = rand()%52
for (j=0j<ij++)
{
if (pokerRand[i] == pokerRand[j])
{
goto MARK
}
}
}
}
//给4个玩家发牌
void Palyer(int *pokerRand)
{
int i, j
int count = 0
for (j=0j<NUMj++)
{
for (i=0i<PLAYERi++)//轮流发牌
{
man[i].manNum[j] = pokerRand[count++]
}
}
}
//统计玩家手中的牌
void Process(int *countA, int *countB, int *countC, int *countD)
{
int i, j
for (i=0i<PLAYERi++)
{
countA[i] = 0
countB[i] = 0
countC[i] = 0
countD[i] = 0
for (j=0j<NUMj++)//统计四个玩家手中的牌
{
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=0i<PLAYERi++)
{
printf("\n第%d人 :\n", i+1)//开始输出第i个玩家
printf("%c:\t", 6)//输出第i个玩家的黑桃牌
for (j=0j<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=0j<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=0j<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=0j<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")
}
实现了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
}
其实发牌问题里有个随机的问题,就是模拟洗牌的问题,我来尝试下这个程序吧(每个花色的代码分别是:红桃 \x3,方块\x4,梅花\x5,黑桃\x6#include <stdio.h>
#include <time.h>
char hua_se[4]={'\x3','\x4','\x5','\x6'} //定义一个数组来存放花色
char *dight[14]={"Ace","two","three","four","中毁搜five","six","seven","eight","nine","ten","jack","queen","king"}/余悔/定义一个指针型的数组来存放数字
int fa_pai[4][13]={0}//定义一个二维数组来发牌
void move(int fa_pai[4][13])
void deal(int fa_pai[4][13],char huase[4],char *dight[4][13])
int main(void){srand(time(NULL))
move(fa_pai)
deal(hua_se,dight,fa_pai)
printf("你是否卖历想结束发牌?Y/N")
getch()return 0}void move(int fa_pai[4][13]){int r,card,row,column
for(card=1card<=52card++)
{
r=rand()
row=r%4
r=rand()
column=r%13
while(fa_pai[4][13]!=0)
{
r=rand()
row=r%4
r=rand()
column=r%13
}
fa_pai[row][column]=card
}
}
void deal(int fapai[4][13],char hua_se[3],char *dight[13])
{
char cint card,row,column
for(card=1card<=52card++)
{
for(row=0row<=3row++)
{
for(column=0column<=12column++)
{
if(fapai[row][column]==card)
{
if(card%3=0)c='\n'
elsec='\t'
printf("%5sof%-8s%c",hua_se[row],dight[column],c)
}
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)