问题求解模拟发牌2

 

/***********************************************************************

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; 

} 

你可能感兴趣的:(模拟发牌,问题求解)