我试图打印出在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;
}

最佳答案

您的代码有几个问题:


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

09-17 20:07