三个人头牛的牌组:
#include<stdio.h> #include<string.h> #include<time.h> typedef struct { char suit [5]; char face [6]; }pai; void fuzhi(pai *a);/*给牌组赋值*/ void dex(int *a);/*给牌组下标初始化*/ void xipai(int *a); /*打乱下标*/ void fapai(pai *a,int *b,int n);/*发一定数目的牌*/ int main() { pai one[52]; int index[52]; fuzhi(one); dex(index); xipai(index); fapai(one,index,15); return 0; } void fuzhi(pai *a) { char *n[]={"1","2","3","4","5","6","7","8","9","10","J","Q","K"}; char *h[]={"红桃","黑桃","方片","梅花"}; int i; for(i=0;i<52;i++) { strcpy(a[i].suit,n[i%13]); strcpy(a[i].face,h[i/13]); } } void fapai(pai *a,int *b,int n) { int i=0,j=0; for(i=0;i<n;i++) { printf("%s %s ",a[b[i]].suit,a[b[i]].face); j++; if(j%5==0) printf(" "); } } void dex(int *a) { int i=0; for(i=0;i<52;i++) { a[i]=i; } } void xipai(int *a) { int i=0,j=0,temp=0; srand(time(NULL)); for(i=0;i<52;i++) { j=rand()%52; if(i!=j) { temp=a[j]; a[j]=a[i]; a[i]=temp; } } }
总结:建立52个结构体做为52张牌(没有大小王),在定义一个长度为52的整形数组,作为牌的下标。
洗牌的技巧:先给下标数组赋初值1-52,随机产生两个数,让着两个数作为下标数组的下标,让这两个元素的值互换,通过产生52次,交换52次,足以打乱牌下标的序号。
定义字符数组时,注意字符串结束标志 也是占一个字符长度大小的,适当定义大点,别越界。
给字符串赋值,不能用=号,因为不能给数组名赋值,它只代表一个地址,所以要用strcpy函数,将一个字符串赋值给另一个字符串,strcpy(a,b)将b复制给a.