C语言模拟纸牌分发

可紊 提交于 2020-03-09 06:16:43

利用指针来实现以下洗发牌的小程序,感受指针的魅力

纸牌52张,分四组 ,

其实只要分为 牌面和牌号 就行了。牌面 有 红桃 黑桃 梅花 方块 (Hearts  spades  diamonds  clubs),牌号是 A 2 3 4 5 6 7 8 9 10 J Q K

 

#include "stdio.h"
  2 #include "time.h"
  3 #include "stdlib.h"
  4 #include "string.h"
  5 typedef struct stu {    //定义纸牌的牌面和类别。
  6    char face[8];
  7    char num[2];
  8 }STR;
  9 
 10 void WriteBoard(STR p[],char *n[],char *f[]) {   //初始化纸牌属性
 11    int i;
 12    for (i = 0;i<52;i++) {
 13          strcpy(p[i].face,f[i/13]);
 14          strcpy(p[i].num,n[i%13]);
 15    }
 16 }
 17 void RandSend(int randnum[]) {            // 洗牌,随机打乱顺序
 18    int i,j,temp;
 19    srand(time(NULL));
 20    for(i =0;i<52;i++)  {
 21      j = rand()%52;
 22      temp = randnum[i];
 23      randnum[i] = randnum[j];
 24      randnum[j] = temp;
 25    }
 26 }
 27 void Initrand(int randnum[]) {        // 牌重新按照顺序排序
 28    int i;
 29    for(i =0;i<52;i++)  {
 30    randnum[i] = i;
 31    }
 32 }
 33 void OutputInit(STR p[],int randnum[]) {    //发牌
 34    int i,b = 0;;
 35    for(i =0;i<52;i++)  {
 36    b++;
 37    printf(" [%.8s] %.2s",p[randnum[i]].face,p[randnum[i]].num);
 38    if(b==13){b = 0; printf("\n");}
 39    }
 40 
 41 }
    void main ()  {
 43    int i;
 44    int randnum[52];  // 洗牌数组
 45    STR board[52];    //存放牌的属性
 46    char *numcon[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","k"}; //牌面
 47    char *facecon[] = {"Hearts","Spades","diamonds","clubs"};    //类型
 48    WriteBoard(board,numcon,facecon);     //装载牌
 49    Initrand(randnum);                    //初始化装载洗牌数据
 50    OutputInit(board,randnum);            //发牌
 51    Initrand(randnum);                    //初始化装载洗牌数据
 52    RandSend(randnum);                    //洗牌
 53    OutputInit(board,randnum);            //发牌
 54 }
                                 

这个代码最值得研究的就是洗牌这里,每次洗牌需要保证牌号都是不一样的,于是使用的srand(time(NILL));这个函数进行播随机种子,这样就保证rand函数在每次执行的时候都能产生不同的组合的数据。 如果不加你就会发现rand虽然产出随机数据,但是每一次的随机数都是同一种组合:

根据随机数,可以利用交换算法吧randnum数组里的有序排列变成无序排列,不管随机数是不是相同都会改变rangnum[i]的值,因为进行了交换。这样才是真正的高效率。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!