2016-02-28 51 views
0

我试图打印出C中5张卡片的每一手中找到的对的数量,但其中1对= 2到3个相同的卡片值,并且2对= 4个相同的卡片值。我应该怎么做才能做到这一点?如何在C中的5张牌的手中匹配相同的2-3张牌值?

代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

/* handy typedefs */ 
typedef unsigned char card; 
typedef unsigned char pairs; 

/* arrays for the names of things */ 
static char *suits[4] = { "Hearts", "Diamonds", "Clubs", "Spades" }; 
static char *values[13]= { "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", 
         "Eight", "Nine", "Ten", "Jack", "Queen", "King" }; 
static char *colour[4]= { "Red", "Red", "Black", "Black" }; 

int compareface(const void *c1, const void *c2); 
void shuffle(int deck[52]); 
pairs findpairs(card *hand); /* finds any pairs in a hand */ 

int main() { 
    int deck[52]; 
    int s, c, a, i, j; 
    pairs numpairs[5], highest; 
    int hand; 

    for (a = 0; a < 52; a++) { //for filling a deck of 52 cards 
     deck[a] = a; 
     printf("\n%s:", colour[deck[a] % 4]); 
     printf(" %s of", values[deck[a]/4]); 
     printf(" %s", suits[deck[a] % 4]); 
    } 

    int hands[5][5], h, cd, winner; 
    int irand; 

    srand(time(NULL));  /* seed the random number generator */ 

    // shuffle the deck before to get the hands: 
    shuffle(deck); 
    j = 0; 
    for (h = 0; h < 5; h++) { 
     printf("\nHand %d:\n", h + 1); 
     for (i = 0; i < 5; i++) { 
      hands[h][i] = deck[j]; 
      printf("%s of", values[hands[h][i]/4]); 
      printf(" %s", suits[hands[h][i] % 4]); 
      printf(" is %s. \n", colour[hands[h][i] % 4]); 
      j++; 
     } 
     printf("Number of pairs: %i \n", findpairs(numpairs)); 
    } 
    // sort the cards by card value: 
    for (h = 0; h < 5; h++) { 
     qsort(hands[h], 5, sizeof(int), compareface); 
    } 

    /* determine the winner and print it */ 
    return 0; 
} 

pairs findpairs(card *hand) { 
    int values[13] = { 0 }; 
    int i, numpairs = 0; 

    for (i = 0; i < 5; i++) { 
     values[hand[i] % 13] += 1; 
    } 

    for (i = 0; i < 13; i++) { 
     numpairs += values[i]/2; 
     } 
return numpairs; 
} 

void shuffle(int deck[52]) { 
    int i, rnd; 
    int c; 

    for (i = 0; i < 52; i++) { 
     /* generate a random number between 0 & 51 */ 
     rnd = rand() * 52.0/RAND_MAX; 
     c = deck[i]; 
     deck[i] = deck[rnd]; 
     deck[rnd] = c; 
    } 
} 

int compareface(const void *c1, const void *c2) { 
    const int cd1 = *(const int*)c1; 
    const int cd2 = *(const int*)c2; 
    int c = 0; //c is used to count card value pairs 
    if (cd1 == cd2) { 
     c = c + 1; 
     if (c == 4) 
      findpairs(cd1 * 2); 
     else 
      findpairs(cd1 * c); 
    }  
    return cd1 - cd2; 
} 
+3

提示:如果你的代码格式正确,人们更可能花时间阅读并尝试帮助你。 – szczurcio

+1

你能举一个不起作用的例子吗?你应该把这个例子放到你的代码中,而不是'shuffle'函数。这样所有人都会(希望)具有相同的确定性程序行为。 –

回答

0

你的代码中有几个问题:

  • compareface通过卡号(0-51)相比,它并不能帮助找到对,您应该通过卡值排序(0-12)。
  • compareface试图通过调用findpairs来做一些更新,但忽略返回值。这是不适合寻找配对的地方。
  • findpairs没有做任何有用的事情:numpairs = card * hand;是语法错误。无论如何,返回值都会被忽略。
  • printf("Number of pairs: %i \n", numpairs);尝试打印int,但给出指向数组numpairs的指针,这是一种类型不匹配,它调用未定义的行为。

你并不需要手中排序来计算对数,使用for循环计数重复的数量为每面值从结果来确定对数:

pairs findpairs(card *hand) { 
    int values[13] = { 0 }; 
    int i, numpairs = 0; 
    for (i = 0; i < 5; i++) { 
     values[hand[i] % 13] += 1; 
    } 
    for (i = 0; i < 13; i++) { 
     numpairs += values[i]/2; 
    } 
    return numpairs; 
} 
+0

@ user4728257:这个答案是否帮助你理解问题并获得正确的值? – chqrlie

+0

我无法正确地获得匹配对功能。 – user4728257

相关问题