模拟扑克牌的洗牌发牌

本文介绍了如何在内存中模拟一副扑克牌,通过洗牌算法打乱顺序,接着创建多个玩家并进行发牌,最终展示每个玩家手中的牌。这是一个涉及随机数生成和数组操作的趣味编程实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在内存中模拟出一副牌,然后模拟洗牌,发牌等动作
流程:构建一副牌保存到一个数组中–>洗牌–>创建玩家–>向玩家发牌–>输出每个玩家的牌

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值