bokee.net

科研管理博客

正文 更多文章

高效的洗牌、发牌程序

高效的洗牌、发牌程序

 

本程序是一个高效的洗牌、发牌程序。函数fillDeck按每门花色从“A”到“K”的顺序初始化数组Card。数组Card传递给函数shuffle,函数shufflefor循环结构循环发放52张(数组下标0~51),程序为每一张牌选择一个051之间的随机数,然后把数组中当前的Card结构与随机选出的Card结构对应交换。

本程序重点训练结构、数组及函数的参数传递。

红桃:A2345678910JQK

方片:A2345678910JQK

黑桃:A2345678910JQK

梅花:A2345678910JQK

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

struct card

 {

   char *face;

   char *suit;

 };

 typedef struct card Card;   /*  定义结构别名  */

 void fillDeck(Card *,char *[],char *[]); /* 注意参数的类型 */

 void shuffle(Card *);

 void deal(Card *);

 main()

 {

Card deck[52];  /* 结构数组,共有52个成员 */

/*下面这两个数组用于存放四种花色各13张,共计52张牌。*/

char *face[]={"Ace","Deuce","Three","Four","Five","Six","Seven",

"Eight","Nine","Ten","Jeck","Queen","King"};  /* AK 13张牌 */

char *suit[]={"Hearts","Diamonds","Clubs","Spades"};/*红桃、方片、梅花、黑桃*/

    srand(time(NULL));  /* 随机数发生器,不用理解 */

    fillDeck(deck,face,suit);

    shuffle(deck);

    deal(deck);

    return 0;

 }

 

/*  按顺序发放52张牌 */  

void fillDeck(Card *wDeck,char *wFace[],char *wSuit[])

   {

     int i;

     for(i=0;i<52;i++)

     {

wDeck[i].face=wFace[i%13];  /*AK13张,注意%/的用法*/  

wDeck[i].suit=wSuit[i/13];/*0-12红桃,13-25方片,2739黑桃,40-52梅花*/

     }

   }

 

   void shuffle(Card *wDeck)

   {

     int i,j;

     Card temp;

     for(i=0;i<52;i++)

     {

       j=rand()%52;   /*52中随机选一个数*/

       temp=wDeck[i];  /*将当前牌的信息存放临时变量*/

       wDeck[i]=wDeck[j];/*将随机选出牌的信息存放当前的结构*/

       wDeck[j]=temp;  /*将临时变量中保存的信息存放随机选出的结构中*/

     }

   }

 

    void deal(Card *wDeck)

    {

      int i;

      for(i=0;i<52;i++)

      {

       printf("%5s of %-8s%c",wDeck[i].face,wDeck[i].suit,(i+1)%2?’\t’:’\n’);

       }

    }

 

 

分享到:

上一篇:用C语言画立体五角星

下一篇:

评论 (1条) 发表评论

发表评论
验证码