ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C语言自动发牌程序

2021-08-03 16:31:35  阅读:132  来源: 互联网

标签:13 int void 张牌 C语言 自动 对应 发牌


问题描述

一副扑克有52张牌,打桥牌时应将牌分给4个人。请设计一个程序完成自动发牌的工作。要求:黑桃用S (Spaces)表示,红桃用H (Hearts)表示,方块用D (Diamonds)表示,梅花用C (Clubs)表示。

问题分析

按照打桥牌的规定,每人应当有13张牌。在人工发牌时,先进行洗牌,然后将洗好的牌按一定的顺序发给每一个人。为了便于计算机模拟,可将人工方式的发牌过程加以修改:先确定好发牌顺序:1、2、3、4;将52张牌顺序编号:黑桃2对应数字0,红桃2对应数字1,方块2对应数字2,梅花2对应数字3,黑桃3对应数字4,红桃3对应数字5,……; 然后从52张牌中随机为每个人抽牌。

下面是完整的代码:

#include<stdlib.h>
#include<stdio.h>
int comp(const void *j, const void *i);
void p(int b[], char n[]);
int main(void)
{
    static char n[]={'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
    int a[53], b1[13], b2[13], b3[13], b4[13];
    int b11=0, b22=0, b33=0, b44=0, t=1, m, flag, i;
    while( t<=52 )  /*控制发52张牌*/
    {
        m=rand()%52;  /*产生0到51之间的随机数*/
        for(flag=1,i=1; i<=t&&flag; i++)  /*查找新产生的随机数是否已经存在*/
            if(m==a[i])
                flag=0;  /*flag=1表示产生的是新的随机数,flag=0表示新产
                          生的随机数已经存在*/
        if(flag)
        {
            a[t++]=m;  /*如果产生了新的随机数,则存入数组*/
            /*根据t的模值,判断当前的牌应存入哪个数组中*/
            if(t%4==0)
                b1[b11++]=a[t-1];
            else
                if(t%4==1)
                    b2[b22++]=a[t-1];
                else
                    if(t%4==2)
                        b3[b33++]=a[t-1];
                    else
                        if(t%4==3)
                            b4[b44++]=a[t-1];
        }
    }
    qsort(b1, 13, sizeof(int), comp);  /*将每个人的牌进行排序*/
    qsort(b2, 13, sizeof(int), comp);
    qsort(b3, 13, sizeof(int), comp);
    qsort(b4, 13, sizeof(int), comp);
    p(b1, n);  /*分别打印每个人的牌*/
    p(b2, n);
    p(b3, n);
    p(b4, n);
    return 0;
}
void p(int b[], char n[])
{
    int i;
    printf("\n\006 ");  /*打印黑桃标记*/
    for(i=0; i<13; i++)  /*将数组中的值转换为相应的花色*/
        if(b[i]/13==0)  /*找到该花色对应的牌*/
            printf("%c ", n[b[i]%13]);
    printf("\n\003 ");  /*打印红桃标记*/
    for(i=0; i<13; i++)
        if((b[i]/13)==1)
            printf("%c ", n[b[i]%13]);
    printf("\n\004 ");  /*打印方块标记*/
    for(i=0; i<13; i++)
        if(b[i]/13==2)
            printf("%c ", n[b[i]%13]);
                printf("\n\005 ");  /*打印梅花标记*/
                for(i=0; i<13; i++)
                    if(b[i]/13==3 || b[i]/13==4)
                        printf("%c ", n[b[i]%13]);
    printf("\n");
}
int comp(const void *j, const void *i)  /*qsort调用的排序函数*/
{
    return(*(int*)i-*(int*)j);
}

运行结果:

Q T 2  8  8 7 5 4  A T 9 7 3

A 9 8 5  K 6 2  Q T 9 6  J 6

K J A Q J T 7 K J 3 2 5 2

- 7 6 4 3 9 5 4 3  A  K Q 8 4

标签:13,int,void,张牌,C语言,自动,对应,发牌
来源: https://blog.csdn.net/qq_59978514/article/details/119352988

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有