C语言模拟洗发牌

问题描述

通过C语言模拟洗发牌的过程,牌一共有52张,四种花色,13中数字。

构成扑克牌

实现
  • 单张牌的构成:牌面 + 花色
    • 牌面标志:梅花clubs,红心hearts,黑桃spades,方片diamonds
    • 牌面:A,2,3,4,5,6,7,8,9,Jack,Queen,King
    • 组合:通过整除13和对13进行除余进行构成扑克牌
代码实现
typedef struct
{
    
    
    char suit[10];  //花色
    char face[10];  //牌面
}CARD;

void FillCard(CARD card[]);

//构成扑克牌
void FillCard(CARD card[])
{
    
    
    char *face[] = {
    
    "A","2","3","4","5","6","7","8","9","10","Jack","Queen","King"};
    char *suit[] = {
    
    "Spades","Hearts","Clubs","Diamonds"};
    int i = 0;
    for(;i < 13;i ++)
    {
    
    
        strcpy(card[i].face,face[i % 13]);
        strcpy(card[i].suit,suit[i / 13]);
    }
}

洗牌

实现
  • 生成一个内容为1到52的随机的数字序列,同时中间没有重复
    • 方法一:生成随机数,范围为0到51,每一次都要检查是否出现了重复
    • 方法二:生成0到51范围内的随机数,然后和当前的i进行交换,即使生成了随机数也没有任何问题
知识补充——生成随机数
  • rand(void)函数
    • 在<stdlib.h>头文件中,生成一个0~RAND_MAX之间的整数
    • 生成的是伪随机数,种子不变生成的随机数的顺序不变
#include <stdio.h>
#include <stdlib.h>
int main(){
    
    
    int a = rand();
    printf("%d\n",a);
    return 0;
}
  • srand()为随机数播种的函数
    • 改变rand()随机数的种子,确保每次运行产生不同的随机数
    • 常用时间戳作为随机数的根
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    
    
    int a;
    srand((unsigned)time(NULL));
    a = rand();
    printf("%d\n", a);
    return 0;
}
代码实现
//生成无规则的乱序的洗牌数组
void Wash(int result[])
{
    
    
    int randnum = 0 ,temp = 0;
    //对所有的数组元素进行初始化
    for(int i = 0;i < 52; i++)
    {
    
    
        result[i] = i;
    }
    //生成随机的是数列
    for(int i = 0; i< 52;i ++)
    {
    
    
        randnum = rand() % 52;
        temp = result[randnum];
        result[randnum] = result[i];
        result[i] = temp;
    }
    return ;
}

//发牌,传入对应的结构体的数组和随机打乱的数组序列

void Deal(CARD card[],int result[])
{
    
    
    for(int i = 0;i < 52;i ++)
    {
    
    
        printf("%10s  %7s  \n",card[result[i]].face,card[result[i]].suit);
    }
}
main()函数
int main()
{
    
    
    int result[52];
    //模拟洗发牌
    CARD card[52];
    FillCard(card);
    Wash(result);
    Deal(card,result);
}
总代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct
{
    
    
    char suit[10];  //花色
    char face[10];  //牌面
}CARD;
void FillCard(CARD card[]); //生成牌
void Deal(CARD card[], int result[]);   //发牌的应用
void Wash(int result[]);

int main()
{
    
    
    int result[52];
    //模拟洗发牌
    CARD card[52];
    FillCard(card);
    Wash(result);
    Deal(card,result);

    return 0;
}

//生成无规则的乱序的洗牌数组
void Wash(int result[])
{
    
    
    srand((unsigned)time(NULL));
    int randnum = 0 ,temp = 0;
    //对所有的数组元素进行初始化
    for(int i = 0;i < 52; i++)
    {
    
    
        result[i] = i;
    }
    //生成随机的是数列
    for(int i = 0; i< 52;i ++)
    {
    
    
        randnum = rand() % 52;
        temp = result[randnum];
        result[randnum] = result[i];
        result[i] = temp;
    }
    return ;
}

//发牌,传入对应的结构体的数组和随机打乱的数组序列

void Deal(CARD card[],int result[])
{
    
    
    for(int i = 0;i < 52;i ++)
    {
    
    
        printf("%10s  %7s  \n",card[result[i]].face,card[result[i]].suit);
    }
}

//构成扑克牌
void FillCard(CARD card[])
{
    
    
    char *face[] = {
    
    "A","2","3","4","5","6","7","8","9","10","Jack","Queen","King"};
    char *suit[] = {
    
    "Spades","Hearts","Clubs","Diamonds"};
    int i = 0;

    for(;i < 52;i ++)
    {
    
    
        strcpy(card[i].face,face[i % 13]);
        strcpy(card[i].suit,suit[i / 13]);
    }
}

猜你喜欢

转载自blog.csdn.net/Blackoutdragon/article/details/108078964
今日推荐