----------------解决方案--------------------------------------------------------
每个牌都有一个用于排序的值,(点数<<8)+(底色<<4) + (花色),所谓的属性优先,实际就是优先级越高的属性,在排序值中位于越高的位上。
然后对这个值进行普通的排序就可以了。用快速排序即可。
比如点数:3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > J > Q > K > A > 2 > 小王 > 大王
规定一个字符串数组:
char *s[]={"2","A",...,"4","3"};
然后设置点数值=0x0到0xE的某个值,那么花色字符串表示就是s[点数值];
例如点数值是0xA; 底色是0x1, 花色是0x2,点数15个,可以4位为一种属性,这样一个值可以容纳更多的属性。
则用于排序的值就是0x0000 0A12;
[[it] 本帖最后由 hoodlum1980 于 2008-3-30 02:11 编辑 [/it]]
----------------解决方案--------------------------------------------------------
josen0205
^_^谢谢你!太佩服你了!太高深了,我都看不懂呢:-(
1.这个函数int GetCards(struct Card *CArray) 对我来说很难理解。其中
srand((unsigned)time(NULL));
r = rand();
m = r%325;
n = r%324;
看不懂,什么意思呀?
2.还有下面这个也不明白
memset(tBcolor, 0, sizeof(tBcolor));
memset(tGrade, 0, sizeof(tGrade));
memset(tColor, 0, sizeof(tColor));
----------------解决方案--------------------------------------------------------
回复 13# 的帖子
这个函数只是为了生成一个随即的序列,srand((unsigned)time(NULL)); 产生随机数的种子
rand(); 生成一个随机数
int GetCards(struct Card *CArray)就是相当于洗牌了,但是这里我只洗了一次。我采用报数出列的方式,从m开始1到n报数,每报n的人出列,这样就可以得到一个序列,由于m和n都是随机的所以新的序列也是随机的。其实可以用几次这种方式打乱顺序,也就相当于我们打牌的时候多洗几次牌了。
memset()就是初始化字符串,把字符串的地址空间置空。
----------------解决方案--------------------------------------------------------