洗牌算法的思想,其本质是对数组元素进行随机重排。数组中每个元素经过洗牌算法后落在数组某个位置上的概率是相等的,洗牌算法在牌类游戏中非常有用.下面直接放demo
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
typedef struct card
{
int Suit;//花色
char Number;//牌数
} Card;
Card OneCard[52];//保存每种扑克的花色、数字
Card NewCard[52];//NewCard保存了洗牌之后的纸牌情况
Card* ShowCard()//显示新扑克牌的牌序情况
{
int i,j,temp;
int suit;
int sign;
suit = -1;
for(i=0; i<52; i++)
{
if(i%13==0)
{
suit++;//改变花色
}
OneCard[i].Suit = suit;//保存花色
temp = i%13;
switch(temp)
{
case 0:
OneCard[i].Number = 'A';
break;
case 9:
OneCard[i].Number = '0';//表示10这张牌
break;
case 10:
OneCard[i].Number = 'J';
break;
case 11:
OneCard[i].Number = 'Q';
break;
case 12:
OneCard[i].Number = 'K';
break;
default:
OneCard[i].Number = temp + '1';
}
}
for(i=0,j=0; j<52; i++,j++)
{
if(j%13==0)
{
printf("\n");
}
switch(OneCard[i].Suit)
{
case 0:
sign=3;
break;
case 1:
sign=4;
break;
case 2:
sign=5;
break;
case 3:
sign=6;
break;
}
printf("%c%c ", sign, OneCard[i].Number);//输出显示
}
printf("\n");
return OneCard;
}
Card* Shuffle(Card* OneCard)//洗牌算法
{
int i,j;
Card tempcard;
for(int loop = 0; loop < 52; loop++) {
NewCard[loop] = OneCard[loop];
}
srand(time(NULL));
for(i=0; i<52; i++)
{
j = rand() % 52;
tempcard = NewCard[j];
NewCard[j] = NewCard[i];
NewCard[i] = tempcard;
}
return NewCard;
}
Card* ShowCard(Card* aCard)
{
for(int i=0, j=0; j<52; i++,j++)
{
if(j%13==0)
{
printf("\n");
}
printf("%c%c ", aCard[i].Suit+3, aCard[i].Number);//输出显示
}
printf("\n");
return aCard;
}
void main()
{
Card *oldCard, *newCard;
printf("一副新牌的初始排列如下");
oldCard = ShowCard();//洗牌前
newCard = Shuffle(oldCard);//开始洗牌
printf("\n洗牌前排列如下:");
ShowCard(oldCard);//显示未洗牌时的牌序情况
printf("\n洗牌后排列如下:");
ShowCard(newCard);//显示未洗牌后的牌序情况
}