C语言简易扑克牌发牌器

        最近练习C语言时发现了一个挺有趣的小练习,遂发上来与诸位分享。

题目:       编写一个C程序,模拟斗地主时扑克牌的随机分发。

思路:     定义一个整型数组来存储这54张扑克牌,并对每张牌进行初始化。

                将每张扑克牌赋予 0~53 这个范围内的一个随机数,并将其打乱。

                通过计算取出每张牌的花色和数值,按每行17张牌进行输出。

接下来上代码:

              

//   Name= "C语言斗地主发牌器"
//   Author: R6bandito
//   Time: 24/7/26

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

void Init(short *p);    //声明初始化函数
void Mix(short *p); //声明混合扑克牌函数
void Show();    //声明显示函数

int main(int argc,const char* argv[])
{
    short cards[54];    //定义数组cards来存储54张扑克牌
    short *p = cards;   //定义一个指针指向数组cards

    srand(time(NULL));  //初始化随机数生成器

//函数调用
     Init(p);
     Mix(p);
     Show(p);

    return 0;
}

对于上述代码,数组cards可以将其定义为全局变量,供所有功能函数调用。但是此处不使用全局变量,将其在main函数中定义,通过指针在其余功能函数中进行访问。

void Init(short *p){    //定义扑克牌初始化函数,初始化54张空扑克牌
    for(short i=0;i<54;i++){
        *p = i;
        p++;
    }
}

void Mix(short *p){     //定义混合扑克牌函数
    for(short i=0;i+1<53;i++){

//以下代码对两张相邻扑克牌取随机数,且两两交换
        *(p+i) = rand()%54;   
        *(p+i+1) = rand()%54;

        short temp = *(p+i);
        *(p+i) = *(p+i+1);
        *(p+i+1) = temp;
    }
}

 此代码中,其实对扑克牌的初始化(即Init()函数)是非必要的,不影响代码的正常运行。

原因在于Mix函数功能是相邻扑克牌两两取随机数后进行互换,当循环结束后每张牌都被赋予了对应的值,也就相当于初始化了。但是每个人有不同的混牌方式,如果你所采用的方式有遍及不到54张扑克牌的可能,则应当提前对54张牌进行初始化。这里我写上作为一个参考。

void Show(short *p){    //定义显示函数
    unsigned char style[4][8] = {"♠️","♥️","♣️","♦️"};  //扑克牌花色
    unsigned char Number[13][8] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};   //扑克牌数值
    unsigned short count = 0;   //定义计数器变量

    for(short i=0;i<54;i++){
        if(p[i] == 52){     //大小王单独拿出
            printf("小王\t");
        }
        if(p[i] == 53){
            printf("大王\t");
        }
        else{
            printf("%s%s\t",style[p[i]/13],Number[p[i]%13]);    //打印扑克牌
        }
        count++;
        if(count == 17){    //每17张换行
            count = 0;
            printf("\n");
        }
    }
}

将大小王拿出单独讨论,其余空白扑克牌则分别对扑克牌的所有数值取整取余,分别得出花色和数值,打印即可。

       到这里,细心的朋友可能已经发现了。这个程序仍然存在一个bug,即该程序只是简单模拟扑克牌的洗牌发牌,并不能做到完全模拟。由于随机数产生的局限性,因此生成的数据有时并不与现实逻辑相吻合,例如 有时54张扑克牌只有一张大王/小王 ,亦或出现两张大小及花色相同的扑克牌。

        由于本人水平有限,目前仍然在寻找最佳解决办法。同时,也望有想法的朋友能不吝赐教,在评论区积极指出。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
好的,下面是一个简单的 C 语言程序,可以模拟扑克牌自动的过程: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM_SUITS 4 #define NUM_RANKS 13 #define NUM_CARDS 52 int main() { // 定义扑克牌的花色和点数 const char* suits[NUM_SUITS] = {"Spades", "Hearts", "Diamonds", "Clubs"}; const char* ranks[NUM_RANKS] = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"}; // 定义一个扑克牌的数组 int deck[NUM_CARDS]; // 生成一个初始的扑克牌数组 int i, j, k; for (i = 0; i < NUM_SUITS; i++) { for (j = 0; j < NUM_RANKS; j++) { deck[NUM_RANKS*i+j] = j; } } // 打乱扑克牌数组的顺序 srand(time(NULL)); for (i = 0; i < NUM_CARDS; i++) { j = rand() % NUM_CARDS; k = deck[i]; deck[i] = deck[j]; deck[j] = k; } // int num_players = 4; int num_cards_per_player = NUM_CARDS / num_players; for (i = 0; i < num_players; i++) { printf("Player %d's cards:\n", i+1); for (j = 0; j < num_cards_per_player; j++) { int card_index = i*num_cards_per_player+j; int suit_index = deck[card_index] / NUM_RANKS; int rank_index = deck[card_index] % NUM_RANKS; printf("%s of %s\n", ranks[rank_index], suits[suit_index]); } printf("\n"); } return 0; } ``` 这个程序定义了扑克牌的花色和点数,然后生成一个初始的扑克牌数组。接着,使用 `srand()` 函数和 `rand()` 函数打乱扑克牌数组的顺序。最后,按照设定的玩家数和每个玩家的数,并输出每个玩家手中的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值