问题描述
通过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]);
}
}