欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序

 更新時(shí)間:2021年12月10日 10:09:27   作者:小輝_Super  
這篇文章主要介紹了利用C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

題目描述

一副撲克有52張牌,打橋牌時(shí)應(yīng)將牌分給4個(gè)人。請(qǐng)?jiān)O(shè)計(jì)一個(gè)程序完成自動(dòng)發(fā)牌的工作。要求:黑桃用S (Spaces)表示,紅桃用H (Hearts)表示,方塊用D (Diamonds)表示,梅花用C (Clubs)表示。

問(wèn)題分析

個(gè)人思路:

這題實(shí)現(xiàn)起來(lái)還是比較簡(jiǎn)單的,只需定義兩個(gè)多維的字符數(shù)組,第一個(gè)用來(lái)存放撲克的編號(hào),第二個(gè)用來(lái)存放4個(gè)玩家的手牌。

52張牌發(fā)給4個(gè)人,需要發(fā)13輪,每輪按玩家的編號(hào)順序給他們發(fā)牌,發(fā)牌時(shí),用隨機(jī)函數(shù)生成要發(fā)牌的編號(hào)(隨機(jī)函數(shù)的介紹可以參考我第61天的練習(xí)),如果該牌之前沒(méi)被發(fā)放(已發(fā)放的牌用'\0'標(biāo)記),則將牌的編號(hào)存放到玩家的手牌數(shù)組中,同時(shí)將該牌的編號(hào)賦值為'\0'。如果生成的隨機(jī)數(shù)對(duì)應(yīng)的牌已經(jīng)被發(fā)過(guò)了,則繼續(xù)生成新的隨機(jī)數(shù)。當(dāng)52張牌全部發(fā)放完畢,打印發(fā)牌的結(jié)果。

撲克數(shù)組char poker[4][13];中的4表示花色種類(lèi)有四種,13表示每種有13張(13個(gè)編號(hào)),撲克牌的編號(hào)(名字)用字符表示,分別為:{'2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A'}('0'表示10)

玩家的手牌數(shù)組是一個(gè)三維字符數(shù)組,char players[PLAYER_NUMBER][4][13] = {0}; (PLAYER_NUMBER是玩家數(shù)量,4表示牌的花色種類(lèi)有4種,13為某種花色的牌最多13張)

初始化時(shí),手牌數(shù)組的所有值設(shè)置為'\0',表示手上無(wú)牌。

代碼實(shí)現(xiàn)

#include <stdio.h>
#include <stdlib.h>       //srand()/rand()
#include <time.h>         //time()

#define CARD_NUMBER   52  //總牌數(shù)(目前僅支持52)
#define PLAYER_NUMBER 4   //玩家數(shù)量

/******************************************************************************
 * @brief 給某個(gè)玩家發(fā)牌
 * @param player_id  玩家編號(hào)
 * @param players    玩家手牌數(shù)組
 * @param left_num   剩余可發(fā)放牌數(shù)
 * @param poker      撲克牌數(shù)組
 * @return   返回0表示發(fā)牌成功,返回-1表示無(wú)牌可發(fā)
 ******************************************************************************/
int Distribute_Card(int player_id, char players[][4][13], int *left_num, char poker[][13])
{
    if(*left_num <= 0)
        return -1;       //無(wú)牌可發(fā)
    int card_id = 0;     //撲克牌編號(hào)
    int card_index = 0;  //手牌數(shù)組下標(biāo)
    do
    {
        /* 隨機(jī)獲取一個(gè)撲克牌的編號(hào)(0~52) */
        card_id = rand() % CARD_NUMBER;
    }while(poker[card_id / 13][card_id % 13] == '\0'); //如果該牌已經(jīng)發(fā)放,繼續(xù)獲取編號(hào)
    (*left_num)--;       //剩余可發(fā)牌數(shù)減1

    while(players[player_id][card_id / 13][card_index] != '\0')
    {
        card_index++;    //到達(dá)該玩家的手牌數(shù)組有效值的下一個(gè)下標(biāo)('\0'表示無(wú)效值)
    }

    /* 給玩家手牌數(shù)組賦值(加一張牌) */
    players[player_id][card_id / 13][card_index] = poker[card_id / 13][card_id % 13];

    /* 將該牌標(biāo)記為無(wú)效牌(已發(fā)放) */
    poker[card_id / 13][card_id % 13] = '\0';

    return 0;
}

/******************************************************************************
 * @brief 打印發(fā)牌結(jié)果
 * @param players    玩家手牌數(shù)組
 ******************************************************************************/
void Print_Result(char players[][4][13])
{
    int i = 0, j = 0, k = 0;

    /* 牌的類(lèi)別 */
    char card_name[][8] = {"黑桃", "紅桃", "方塊", "梅花"};

    for(i = 0; i < PLAYER_NUMBER; i++)
    {
        printf("\n玩家%d:\n", i + 1);
        for(j = 0; j < 4; j++)
        {
            printf("%s: ", card_name[j]); //打印卡牌類(lèi)型

            //依次打印某玩家該類(lèi)型的手牌
            for(k = 0; players[i][j][k]!= '\0' && k < 13; k++)
            {
                if(players[i][j][k] == '0')
                    printf("10 ");        //'0'對(duì)應(yīng)10
                else
                    printf("%c ", players[i][j][k]);
            }
            printf("\n");
        }
    }
}

int main()
{
    /* 撲克牌數(shù)組 */
    char poker[4][13] = {{'2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A'},\
                         {'2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A'},\
                         {'2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A'},\
                         {'2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A'}};
    int left_num = sizeof(poker);             //剩余可發(fā)放牌數(shù)(應(yīng)該等于CARD_NUMBER)
    char players[PLAYER_NUMBER][4][13] = {0}; //玩家手牌數(shù)組
    int i = 0, j = 0, k = 0;

    //用系統(tǒng)秒數(shù)初始化隨機(jī)數(shù)種子
    srand((unsigned)time(NULL));

    /* 給每個(gè)玩家發(fā)牌 */
    for(i = 0; i < CARD_NUMBER/PLAYER_NUMBER + 1; i++) //當(dāng)玩家是奇數(shù)時(shí),需要+1(這個(gè)值只能多不能少)
    {
        for(j = 0; j < PLAYER_NUMBER; j++)
        {
            //給某一個(gè)玩家發(fā)牌
            if(!Distribute_Card(j, players, &left_num, poker))
                k++;  //發(fā)牌成功次數(shù)+1
        }

    }
    printf("\n成功發(fā)牌%d次!\n", k); //總發(fā)牌次數(shù)
    Print_Result(players); //打印結(jié)果

    return 0;
}

運(yùn)行結(jié)果

網(wǎng)上參考

這份代碼的實(shí)現(xiàn)思路和我差不多,但是還是存在許多細(xì)節(jié)上的差異,同時(shí)他還在發(fā)牌結(jié)束后給每個(gè)人的手牌進(jìn)行了排序(從大到?。??!静贿^(guò)他的隨機(jī)函數(shù)的隨機(jī)數(shù)種子是固定的,這樣會(huì)導(dǎo)致每次運(yùn)行的結(jié)果都相同】

#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 )  /*控制發(fā)52張牌*/
    {
        m=rand()%52;  /*產(chǎn)生0到51之間的隨機(jī)數(shù)*/
        for(flag=1,i=1; i<=t&&flag; i++)  /*查找新產(chǎn)生的隨機(jī)數(shù)是否已經(jīng)存在*/
            if(m==a[i])
                flag=0;  /*flag=1表示產(chǎn)生的是新的隨機(jī)數(shù),flag=0表示新產(chǎn)
                          生的隨機(jī)數(shù)已經(jīng)存在*/
        if(flag)
        {
            a[t++]=m;  /*如果產(chǎn)生了新的隨機(jī)數(shù),則存入數(shù)組*/
            /*根據(jù)t的模值,判斷當(dāng)前的牌應(yīng)存入哪個(gè)數(shù)組中*/
            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);  /*將每個(gè)人的牌進(jìn)行排序*/
    qsort(b2, 13, sizeof(int), comp);
    qsort(b3, 13, sizeof(int), comp);
    qsort(b4, 13, sizeof(int), comp);
    p(b1, n);  /*分別打印每個(gè)人的牌*/
    p(b2, n);
    p(b3, n);
    p(b4, n);
    return 0;
}
void p(int b[], char n[])
{
    int i;
    printf("\n\006 ");  /*打印黑桃標(biāo)記*/
    for(i=0; i<13; i++)  /*將數(shù)組中的值轉(zhuǎn)換為相應(yīng)的花色*/
        if(b[i]/13==0)  /*找到該花色對(duì)應(yīng)的牌*/
            printf("%c ", n[b[i]%13]);
    printf("\n\003 ");  /*打印紅桃標(biāo)記*/
    for(i=0; i<13; i++)
        if((b[i]/13)==1)
            printf("%c ", n[b[i]%13]);
    printf("\n\004 ");  /*打印方塊標(biāo)記*/
    for(i=0; i<13; i++)
        if(b[i]/13==2)
            printf("%c ", n[b[i]%13]);
                printf("\n\005 ");  /*打印梅花標(biāo)記*/
                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調(diào)用的排序函數(shù)*/
{
    return(*(int*)i-*(int*)j);
} 

以上就是C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言自動(dòng)發(fā)牌程序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++ OpenCV讀寫(xiě)XML或YAML文件的方法詳解

    C++ OpenCV讀寫(xiě)XML或YAML文件的方法詳解

    XML是一種元標(biāo)記語(yǔ)言。所謂元標(biāo)記,就是開(kāi)發(fā)者可以根據(jù)自身需要定義自己的標(biāo)記。YAML是一個(gè)可讀性高,用來(lái)表達(dá)資料序列的格式。本文將通過(guò)C++和OpenCV實(shí)現(xiàn)這兩種文件的讀寫(xiě),需要的可以參考一下
    2022-05-05
  • C++ VTK實(shí)例之高斯隨機(jī)數(shù)的生成

    C++ VTK實(shí)例之高斯隨機(jī)數(shù)的生成

    這篇文章主要介紹了VTK的一個(gè)實(shí)例之高斯隨機(jī)數(shù)的生成,本文演示了從一個(gè)平均數(shù)是0.0和標(biāo)準(zhǔn)偏差是2.2的高斯分布中隨機(jī)生成3個(gè)隨機(jī)數(shù)。感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11
  • C 語(yǔ)言程序結(jié)構(gòu)示例解析

    C 語(yǔ)言程序結(jié)構(gòu)示例解析

    本文主要講解C 語(yǔ)言程序結(jié)構(gòu),這里提供簡(jiǎn)單的示例來(lái)講解C 語(yǔ)言程序的結(jié)構(gòu),有利于剛剛學(xué)習(xí)C 語(yǔ)言的同學(xué)理解程序結(jié)構(gòu)
    2016-08-08
  • C語(yǔ)言實(shí)現(xiàn)繪制余弦曲線

    C語(yǔ)言實(shí)現(xiàn)繪制余弦曲線

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)繪制余弦曲線的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語(yǔ)言游戲必備:光標(biāo)定位與顏色設(shè)置的實(shí)現(xiàn)方法

    C語(yǔ)言游戲必備:光標(biāo)定位與顏色設(shè)置的實(shí)現(xiàn)方法

    本篇文章是對(duì)c語(yǔ)言中光標(biāo)定位與顏色設(shè)置的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言 文件操作解析詳解及實(shí)例代碼

    C語(yǔ)言 文件操作解析詳解及實(shí)例代碼

    這篇文章主要介紹了C語(yǔ)言 文件操作解析詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法

    C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法

    本文主要介紹了C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 聊聊C++ 運(yùn)算符重載知識(shí)

    聊聊C++ 運(yùn)算符重載知識(shí)

    運(yùn)算符重載是一種形式的C++多態(tài),重載運(yùn)算符可以使代碼看起來(lái)更加自然,下面通過(guò)例子介紹下C++ 運(yùn)算符重載知識(shí),感興趣的朋友一起看看吧
    2021-11-11
  • C++四種case的詳細(xì)介紹小結(jié)

    C++四種case的詳細(xì)介紹小結(jié)

    本文主要介紹了C++四種case的詳細(xì)介紹小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹(shù)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹(shù)

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之?二叉鏈表創(chuàng)建二叉樹(shù),下文我們?yōu)榱烁奖愕氖褂枚鏄?shù)結(jié)構(gòu)體,可以使用?typedef?對(duì)結(jié)構(gòu)體進(jìn)行命名,具體內(nèi)容需要的小伙伴可以參考一下
    2022-02-02

最新評(píng)論