首先保存一副扑克牌

struct s  PAI
{
	char	suit[10];   //储存花色
	char	face[10];   //储存牌面
}card[52];              //共52张牌
int i;
for(i=;i<52;i++)
{
	strcpy(card[i].suit,pSuit[i/13]);
	strcpy(card[i].face,pFace[i%13]);
}

char *pSuit[]={"Spades","Hearts","Clubs","Diamonds"};
cahr *pFace[]={"A","2","3","4","5,"6","7","8","9","10","Jack","Queen","King"};

有两种方法

  1. 每次输出时就生成一个随机数,输出的就是这个随机数所对应的牌
    缺陷——随着生成随机数的数量增加,新的随机数与已产生的随机数相同的可能性越来越大,有可能出现算法延迟问题
  2. 现将52张牌与牌面顺序排放,再将其随机打乱。每次循环生成一个0~51之间的随机数 j ,然后将result中的法排序号result[i]与随机选出的result[j]进行交换。
    此法更高效
void Initialize(int result[])   //按新牌顺序编号
{
	int i;
	for(i=0;i<52;i++)
	{
		result[i]=i;
	}
}

void Shuffle(int result[]) 
//通过对编号随机置乱,实现洗牌
{
	int i,j,temp;
	srand(time(NULL));
	for(i=0;i<52;i++)
	{
		j=rand()%52;
		temp=result[i];
		result[i]=result[j];
		result[j]=temp;
	}
}

完整代码

#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
typedef struct card
{
	char suit[10];    //花色
	char face[10];    //牌面
}CARD;
void Initialize(int result[])   //按新牌顺序编号
{
	int i;
	for(i=0;i<52;i++)
	{
		result[i]=i;
	}
}

void Shuffle(int result[])    //通过对编号随机置乱,实现洗牌
{
	int i,j,temp;
	srand(time(NULL));
	for(i=0;i<52;i++)
	{
		j=rand()%52;
		temp=result[i];
		result[i]=result[j];
		result[j]=temp;
	}
}
void FillCard(CARD card[]);
void Deal(CARD card[], int result[]);  //输出
void Initialize(int result[]);     //按新牌顺序编号
void Shuffle(int result[]);        //通过对编号随机置乱,实现洗牌
main()
{
	CARD card[52];
	int result[52];
	FillCard(card);          //将牌面和花色顺序存放于结构体数组card
	Initialize(result);      //将牌编号存放于数组result中
	Deal(card,result);       //输出洗牌前的结果
	Shuffle(result);         //洗牌
	printf("在洗牌后:\n");
	Deal(card,result);       //输出洗牌后的结果
}	
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐