C语言的洗牌发牌小程序

构建一副扑克牌,并实现洗牌发牌。


代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define NUM 10000 //洗牌混乱度

char color[7][7] = {"空白","红桃","黑桃","草花","方片","小王","大王"};  // 1:红桃 2:黑桃 3:草花 4:方片 5:小王 6:大王
char number[]={"0A234567890JQK"};  // 0:不存内容 1:A  2:2  3:3  4:4  5:5  6:6  7:7  8:8  9:9  10:10  11:J  12:Q  13:K

//构建扑克
struct card{
    unsigned int number;
    unsigned int color;
};

unsigned int NUM_card=53; //剩余未发的牌数(发牌时用的变量)

struct card card[54]; //创建保存一副牌的结构体


//构建一副牌(有序)
void creat_pair_card()
{
    int num=1;
    int col=1;
    int i=0;
    for(num=1;num<=15;num++)
    {
        //生成大小王
        if(num>=14)
        {
            card[i].number=num;
            card[i].color=col++;
            i++;
        }
        else
        {
            //生成普通牌
            for(col=1;col<=4;col++)
            {
                card[i].number=num;
                card[i].color=col;
                i++;
            }
        }
    }
}

//显示一副牌
void print_card()
{
    int i;   
    int num,col;  //点数与花色对应数组下标
    for(i=0;i<54;i++)
    {
        col=card[i].color;
        num=card[i].number;
        if(col>=5)
        {
            printf("%s\t",color[col]);
        }
        else
        {
            if(num==10)
            {
                printf("%s:",color[col]);
                printf("10\t");
            }
            else
            {
                printf("%s:",color[col]);
                printf("%c\t",number[num]);
            }
        } 
    }
    printf("\n");
}


//洗牌
void wash_card()
{
    int i;
    int ch1,ch2;
    srand((unsigned)time(NULL));
    for(i=0;i<NUM;i++) //循环次数越大越乱
    {
        
        
        ch1=rand()%100;  //2147483647 取最后两位0-99
        ch2=rand()%100;
        

        if(ch1>53)
        {
            ch1=100-ch1; //随机数大于53则减小
        }

        if(ch2>53)
        {
            ch2=100-ch2;
        }

        if(ch1 == ch2)
        {
            continue;
        }
        //两个随机牌交换
        struct card tmp=card[ch1];
        card[ch1]=card[ch2];
        card[ch2]=tmp;
    }
}

//发牌
void send_card(struct card hand[],int num)
{
    if(NUM_card<num)
    {
        printf("数量不足\n");
        return;
    }
    int i;
    for(i=0;i<num;i++)
    {
        hand[i]=card[NUM_card-i];
    }
    NUM_card=NUM_card-num;
}


//显示手牌
void print_hand_card(struct card hand[],int num)
{
    int i;
    int point,col;
    for(i=0;i<num;i++)
    {
        col=hand[i].color;
        point=hand[i].number;
        if(col>=5)
        {
            printf("%s ",color[col]);
        }
        else
        {
            if(point==10)
            {
                printf("%s:",color[col]);
                printf("10 ");
            }
            else
            {
                printf("%s:",color[col]);
                printf("%c ",number[point]);
            }
        } 
    }
    printf("\n");
}


int main(void)
{

    creat_pair_card();  //创建一副牌 有序
    wash_card();//洗牌
    print_card();//打印

    struct card hand1[17]; //创建两个结构体保存手牌17张
    struct card hand2[17];
    send_card(hand1,17); //发牌
    send_card(hand2,17);
    printf("手牌A: ");
    print_hand_card(hand1,17);
    printf("\n");
    printf("手牌B: ");
    print_hand_card(hand2,17);
    printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lmory233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值