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