如何在C中的5张牌中匹配相同的2-3张牌值?

时间:2016-02-28 10:55:46

标签: c matching

我试图打印出C中5张卡每只手中找到的对数不成功,其中1对= 2到3张相同的卡值,2对= 4张相同的卡值。我应该怎么做才能使这项工作?

代码:

#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;
}

1 个答案:

答案 0 :(得分: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;
}