算法练习之洗牌算法

洗牌算法的思想,其本质是对数组元素进行随机重排。数组中每个元素经过洗牌算法后落在数组某个位置上的概率是相等的,洗牌算法在牌类游戏中非常有用.下面直接放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);//显示未洗牌后的牌序情况

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值