Я работаю над школьным проектом по разработке игры в покер. У меня есть код, который случайным образом генерирует карточки, но у меня возникают проблемы с использованием функций для их сортировки. Я считаю, что сам алгоритм работает, но я не уверен, как правильно получить доступ к переменным в массиве. Visual Studio выдает мне ошибки argument of type "int (*)[5]
несовместим с параметром типа int *(*)[5]
и 'void sortPokerHand(int *[][5])': cannot convert argument 1 from 'int [2][5]' to 'int *[][5]'
.
Объявление pokerHand в main ()
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);
Спасибо за любую помощь
«// покерная комбинация пузырьковой сортировки» - Почему? Что не так с std::sort
?
Измените int * pokerHand [2] [5] на int ** pokerHand.
Наверное, все равно не получится. int [][]
не совместим с int**
Пошел, вероятно, потому что я не видел определения pokerHand
в вопросе. int pokerHand[2][5];
уж точно не влезет в int**
.
@ user4581301 Посмотрите в начало вопроса.
Вы делаете это намного, намного труднее, чем следовало бы. Примите во внимание следующие предварительные условия:
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 }
Точно так, как мы и ожидали.
Вот и все. В более общих решениях у нас был бы произвольный размер руки, и мы должны были бы задействовать его с помощью функций сортировки и печати, чтобы обеспечить полную и правильную работу. Зная, что это статический размер пять, сделать это немного проще.
Также обратите внимание, что вы можете полностью изменить определение hands
, чтобы использовать указатели на массивы, а не массивы массивов, или даже указатели на указатели, и он все равно будет работать, если в sortHand
и / или printHand
будет использоваться int*
. указывая на пять значений int
.
Настоящий вопрос будет заключаться в том, как вообще у вас получится что-то вроде 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);
По большей части это неправильно.
int* pokerHand[2][5]
- это массив из 2 массивов по 5 указателейint
.*
там быть не должно. Вы передаетеint
в функцию подкачки, которая, как объявлено, принимаетint*
, а затем в этой функции обрабатываете его какint (*)[n]
, гдеn
должен бытьint
, но вы используетеint*
. Короче говоря, не особо не нуждается в исправлении. Если это не вызывает предупреждений компилятора, вам серьезно нужно поднять уровень предупреждений до педантичных высот.