#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")
}
# include <stdio.h>#include <time.h>
#include <stdlib.h>
int card[52]
void Display(int i)//将0~51之间的数映射成牌号和花色
{
switch(i%4)
{
case 0:printf("红桃")break
case 1:printf("黑桃")break
case 2:printf("梅花")break
case 3:printf("方块")break
}
if(i/4+1<11)
printf("%d\t",i/4+1)
else if(i/4+1==11)
printf("%c\t",'J')
else if(i/4+1==12)
printf("%c\t",'Q')
else if(i/4+1==13)
printf("%c\t",'K')
}
void InitCard()
{
int i,j,temp
srand((int)time(0))
for(i=0 i<52 i++)//随机生成52个数
{
temp = rand()%52
for(j=0 j<i j++)
{
if(card[j] == temp) break
}
if(j==i) card[i] = temp
else i--
}
for(i=0 i<52 i++)//初始化输出
{
if(i%5==0 && i!=0) printf("\n")
Display(card[i])
}
}
void deal()
{
int i,j,temp
srand((int)time(0))
for(i=0 i<52 i++)
{
temp = rand()%52
for(j=0 j<i j++)
{
if(card[j] == temp) break
}
if(j==i) card[i] = temp
else i--
}
for(i=0 i<52 i++)//发牌输出
{
if(i%5==0 && i!=0) printf("\n")
if(i%13==0 && i!=0) printf("\n\n")
if(i%13==0)
printf("第%d个玩家的牌:\n",i/13+1)
Display(card[i])
}
}
int main(void)
{
int key=0
printf("================主菜单==============\n")//菜单
printf("=============1、 初始化扑克=========\n")
printf("=============2、 洗牌、发牌=========\n")
printf("=============3、 退出 ==============\n")
while(key!=3)//选择菜单
{
printf("请输入菜单功能编号:")
scanf("%d",&key)
switch(key)
{
case 1:InitCard()break//初始化
case 2:deal()//发牌
default: break
}
printf("\n\n")
}
return 0
}
代码如上,测试结果:
基本思想就是,只要随机生成的数,发给谁都一样;所以初始化和发牌时候先随机生成52个不同的数0~51,初始化时,直接输出就可以了。发牌时按13一组一次分给一个人就可以了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)