我一直在为学校开发扑克游戏的项目。我有随机生成卡的代码,但是在使用函数对它们进行排序时遇到问题。我相信算法本身可以工作,但是我不确定如何正确访问数组中的变量。 Visual Studio给我错误argument of type "int (*)[5]
与类型int *(*)[5]
和'void sortPokerHand(int *[][5])': cannot convert argument 1 from 'int [2][5]' to 'int *[][5]'
的参数不兼容。
main()中的pokerHand声明
int pokerHand[2][5];
我的功能
//swap the two values
void swap(int* pokerHand, int* x, int* y)
{
int tempVal = pokerHand[0][x];
int tempSuit = pokerHand[1][x];
pokerHand[0][x] = pokerHand[0][y];
pokerHand[1][x] = pokerHand[1][y];
pokerHand[0][y] = tempVal;
pokerHand[1][y] = tempSuit;
}
void sortPokerHand(int* pokerHand[2][5])
{
//bubble sort poker hand
bool swapped;
for (int i = 0; i < 4; i++)
{
swapped = false;
for (int j = 0; j < (5 - i - 1); j++)
{
if (pokerHand[0][j] > pokerHand[0][j + 1])
{
swap(pokerHand[2][5], pokerHand[0][j], pokerHand[0][j + 1]);
swapped = true;
}
}
// If no two elements were swapped by inner loop, then break
if (swapped == false)
break;
}
}
我如何尝试使用该功能
sortPokerHand(pokerHand);
感谢您的帮助
答案 0 :(得分:2)
您正在做的事情比应做的要困难得多。请考虑以下先决条件:
int
值的序列鉴于此,您的swap
例程是完全错误的。它应按地址占用两个int
(因此,指向int
的指针),并使用它们来交换内容:
void swapInt(int *left, int *right)
{
int tmp = *left;
*left = *right;
*right = tmp;
}
接下来,在排序时,我们正在对单手进行排序。这意味着由五个int
组成的单个序列。因此,无需传递数组数组,指向数组的指针,指针数组或任何其他方法。做到这一点,干净又基本:
// assumption: a hand has five cards
void sortPokerHand(int hand[])
{
// bubble sort sequence of int
size_t len = 5;
bool swapped = true;
while (swapped && len-- > 0)
{
swapped = false;
for (size_t i = 0; i < len; ++i)
{
if (hand[i] > hand[i + 1])
{
swapInt(hand + i, hand + i + 1); // note: uses our new swap function
swapped = true;
}
}
}
}
最后,我们需要一些帮助,都需要排序。为了这个示例,我在main()
中将它们声明为数组的内联数组,然后进行两次调用以对它们进行实际排序,一次调用一次。首先,我们需要一个打印功能:
void printHand(const int hand[])
{
fputc('{', stdout);
for (size_t i = 0; i < 5; ++i)
printf("%d ", hand[i]);
puts("}");
}
足够简单。现在main()
int main()
{
int hands[2][5] =
{
{ 5,10,7,4,1 },
{ 3,6,8,2,9 }
};
for (size_t i = 0; i < 2; ++i)
{
sortPokerHand(hands[i]);
printHand(hands[i]);
}
return EXIT_SUCCESS;
}
该程序的输出为:
{1 4 5 7 10 }
{2 3 6 8 9 }
完全符合我们的预期。
就是这样。在更一般的解决方案中,我们将具有任意大小,必须通过排序和打印功能来波动,以确保完整而正确的活动。知道它是静态大小5会使它变得容易一些。
还请注意,您可以完全更改hands
的定义,以使用指向数组的指针,而不是使用数组数组,甚至不使用指向指针的指针,只要它能够sortHand
和/或printHand
指向int*
,指向五个int
值。
答案 1 :(得分:0)
真正的问题是,首先您将如何获得类似int *pokerHand[2][5]
之类的东西。
C ++的优点之一是相当丰富的类型系统。如果这样做,我可能会先定义卡的类型:
class card {
enum { clubs, diamonds, spades, hearts } suit;
int value; // 1-13 = Ace - King
public:
bool operator<(card const &other) {
if (suit < other.suit)
return true;
if (other.suit < suit)
return false;
return value < other. value;
}
};
因此,operator<
首先按西装排序,然后按西装中的值排序,因此同一西装中的所有纸牌将一起排序。
从那里开始,一副扑克牌通常将是五张牌,所以我们只有:
std::vector<card> poker_hand;
对手进行排序类似于:
std::sort(poker_hand.begin(), poker_hand.end());
如果您想编写自己的排序例程,显然可以,但是最终还是很简单的-卡的一维向量,您可以直接对其进行比较,例如:
if (secondCard < firstCard)
swap(secondCard, firstCard);
答案 2 :(得分:-1)
将int * pokerHand [2] [5]更改为int ** pokerHand。