/***********************************************************************
2. 随机发牌:去掉大小王,发给4个人,每人发13张,要求分四行,并按花色
和牌点排序。样例:SAK9 HKT9876 DQ32 CJ。
分析:
首先创建一个结构体来表示牌,包括花色和面值,共52张牌,用一个结构体数
组表示即可。填充花色时,采用依次填充一种花色,当前花色填充完毕,换成
下一钟花色。洗牌采用将每一个位置的牌随机同另外的牌交换一次来以到达洗
牌的目的。在排序时要特别注意,由于面值和花色都不是规则的,既其大小不
是顺序的。我们将转换为相应的有序数值进行比较,2——A装换为2——14;花色依
次转换为20——23,转换之后可以很简单就比较其大小。
*************************************************************************/
/******************************************************************************* Copyright (c)哈尔滨工程大学 曾相未 保留所有权利。 文件名: main.cpp 描述: 问题求解模拟发牌 作者: 曾相未 时间:2013/10/3 *******************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <time.h> struct card { char suit;//花色 char face;//面值 };//牌的结构体 typedef struct card Card;//结构体重命名 //将面值及花色转换为相应的数值便于排序 int facetonum(char a) { //花色的转换 if(a == '\006') return 23;//黑桃 if(a == '\003') return 22;//红桃 if(a == '\004') return 21;//方块 if(a == '\005') return 20;//梅花 //面值的转换 if(a == 'A') return 14; if(a == 'T') return 10; if(a == 'J') return 11; if(a == 'Q') return 12; if(a == 'K') return 13; return a - '0'; } //比较牌大小的函数 int compare(const void *elem1,const void *elem2) { Card * elem1t = (Card*) elem1; Card * elem2t = (Card*) elem2; //先从花色判断大小 if(facetonum(elem1t->suit) > facetonum(elem2t->suit)) return -1; if(facetonum(elem1t->suit) < facetonum(elem2t->suit) ) return 1; //花色相同由面值决定大小 return facetonum(elem1t->face) > facetonum(elem2t->face) ? -1:1; } //填充面值及花色 void fillDeck(Card *wDeck, char wFace[], char wSuit[]) { int i; for (i=0; i<52; i++) { wDeck[i].face = wFace[i%13];//面值13张轮换一次 wDeck[i].suit = wSuit[i/13];//每种花色是13张 } } //洗牌 void shuffle(Card *wDeck) { int i, j; Card temp;//用于交换的中间牌 srand(time(NULL)); for (i=0; i<52; i++) { j = rand()%52;//产生0 - 51的随机数 //将当前牌与j位置的牌交换 temp.suit = wDeck[i].suit; temp.face = wDeck[i].face; wDeck[i].suit = wDeck[j].suit; wDeck[i].face = wDeck[j].face; wDeck[j].suit = temp.suit; wDeck[j].face = temp.face; } } //发牌 void deal (Card *wDeck) { int i; printf("\n\n"); for (i=0; i<52; i++) printf("%c%c%c", wDeck[i].suit, wDeck[i].face, (i+1)%13==0 ? '\n' : ' ');//13牌为一组 } int main() { Card deck[52]; //面值数组 char face[] = {'A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2'}; //花色数组 char suit[] = {'\006', '\003', '\004', '\005'}; fillDeck(deck, face, suit); shuffle(deck); //对每一手牌进行排序 qsort(deck,13,sizeof(deck[0]),compare); qsort(deck+13,13,sizeof(deck[0]),compare); qsort(deck+26,13,sizeof(deck[0]),compare); qsort(deck+39,13,sizeof(deck[0]),compare); deal(deck); return 0; }