在内存中模拟出一副牌,然后模拟洗牌,发牌等动作
流程:构建一副牌保存到一个数组中–>洗牌–>创建玩家–>向玩家发牌–>输出每个玩家的牌
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <malloc.h>
//一副牌的数量
#define CARD_COUNT 54
//定义扑克的花色, 黑,红,梅,方,小王 ,大王
enum Color{BLACK, RED, CLUB, DIAMOND, JOKER1, JOKER2};
//定义扑克结构体
typedef struct Card
{
int val; //扑克牌点数
enum Color color; //花色
}Card;
//定义玩家
typedef struct Player
{
char name[64]; //玩家名字
Card** cards; //玩家分到的牌,每项是一个指针,指向原始一副牌数组中的一项,这样可以节省空间
int cardsCount; //每个玩家分到的牌的数量
}Player;
//分完牌后调用的函数的类型
typedef int (*pCompare)(Card*, Card*);
//原始一副牌所在的数组
Card pokers[CARD_COUNT];
//初始化一副牌
void InitOnePoker()
{
//前52张
int i=0;
for (i=0; i<CARD_COUNT-2; ++i)
{
pokers[i].val = i/4 + 1;
pokers[i].color = (Color)(i%4);
}
//剩下的大王和小王
pokers[i].val = i/4 + 1;
pokers[i].color = JOKER1;
//大王
pokers[i+1].val = i/4 + 2;
pokers[i+1].color = JOKER2;
}
//洗牌,参数是最原始的一副牌,返回洗完后的牌
Card** Shuffle(Card* pokers)
{
//分牌返回牌数组的内存空间
Card** retPokers = (Card**)malloc(sizeof(Card*)*CARD_COUNT);
//为了不改动原始的一副牌,另建一个数组,保存原始牌的指针(注意每项不是牌,而是牌的指针)
Card** pokers2 = (Card**)malloc(sizeof(Card*)*CARD_COUNT);
for (int i=0; i