利用指针来实现以下洗发牌的小程序,感受指针的魅力
纸牌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]的值,因为进行了交换。这样才是真正的高效率。
来源:CSDN
作者:你是魔鬼吗??
链接:https://blog.csdn.net/weixin_42104550/article/details/104716853