#c #function #linked-list
#c #функция #связанный список
Вопрос:
итак, у меня есть связанный список, который должен представлять комбинацию из пяти игральных карт. Я пытаюсь написать функцию, чтобы проверить, являются ли карты флеш-роялем. Первое, что я делаю, это проверяю, одинакова ли масть всех карт. Следующий момент-это то, где у меня возникли проблемы. Моя идея заключается в том, что я бы проверил, является ли какая-либо из карт королем (13). Если она есть, то она снова пройдет по списку, проверяя наличие дамы, валета, туза и 10, и если в какой-то момент карта не найдена, она возвращает 0. Если все карты на месте и у них одинаковая масть, функция возвращает 1. Это то, что у меня есть до сих пор:
int royalFlush(card* pHand) { card* temp = pHand; if (!suitCheck(temp)) { return 0; } else { while (temp != NULL) { //check if the card has the right face here temp = temp-gt;next; } } } int suitCheck(card* pHand) { card* tmp; tmp = pHand; while (tmp != NULL) { if (tmp-gt;suit != tmp-gt;next-gt;suit) { return(0); } tmp = tmp-gt;next; } return(1); }
У меня возникли проблемы с тем, чтобы понять, как переходить с одной карты на другую и проверять, имеет ли лицо каждой карты правильное значение. Я также не уверен, что это: tmp-gt;следующий-gt;gt;костюм-это то, что компилятор может правильно прочитать.
Комментарии:
1. Да,
tmp-gt;next-gt;suit
это то, что понимает компилятор. Но если вы собираетесь это сделать, цикл должен бытьwhile (tmp != NULL amp;amp; tmp-gt;next != NULL)
.2. Альтернативой является сохранение масти первой карты, например
int suit = pHand-gt;suit;
, а затем проверка того, что каждая карта соответствует этой масти.3. Является ли рука все той же масти? Это первый шаг. Если вы можете это проверить, то проверьте, содержит ли он необходимые лицевые карточки. Если вы знаете, что все они одной масти, вам не нужно беспокоиться о том, чтобы найти две карты с любым лицом: например, два валета или две дамы.
4.Чтобы помочь вам (и другим) прочитать ваш код, рекомендуется дать вашим функциям имя, специфичное для того, что они делают (обычно что-то, связанное с глаголом). Например,
suitCheck
«проверяет» костюмы, но неясно, что это за проверка. Что-то вродеisSameSuit
было бы более осмысленным именем.5. Очень наивный метод, который вы могли бы использовать, — это просто посчитать, сколько каждой масти и ценности в руке. Это было бы более универсально и для других вещей. Таким образом, у вас будет длина массива 13 для значения и длина массива 4 для костюма. Затем вы просматриваете список и увеличиваете соответствующий счетчик костюмов и значений. Теперь просто проверить, все ли необходимые карты на месте. Просто будет «1» в тузе, 10, J, Q, K и 5 в одном из подсчетов масти. Предполагая, что в руке 5 карт. В этом отношении странно вообще представлять руку в виде связанного списка.
Ответ №1:
Предполагая, что карты отсортированы по масти и по убыванию значения,
- Если рука пуста,
- Верните значение false.
- Получите масть первой карты.
- Создайте массив [ Туз, Король, Дама, Валет, Десятка ].
- Установите
i
значение индекса первого элемента массива. - Установите текущую карту на первую карту.
- В то время как текущая карта не пуста и
i
находится в пределах массива,- Если масть текущей карты не совпадает с мастью первой карты,
- Верните значение false.
- Если ранг текущей карты не соответствует рангу, соответствующему индексу
i
,- Верните значение false.
- Прирост
i
. - Сделайте текущую карту следующей картой.
- Если масть текущей карты не совпадает с мастью первой карты,
- Верните значение True.
Обратите внимание, что связанный список-это очень странная структура, которую нужно использовать для раздачи в карточной игре.
Ответ №2:
Добро пожаловать в SO! Надеюсь, вам здесь понравится.
Если вы можете немного изменить сигнатуру функции, вы можете сделать что-то вроде этого:
int suitCheck(card *pHand, suit expected_suite) { if(pHand == NULL) { return 0; /* You can remove this if you're absolutely sure the initial next of the original pHand is not NULL */ } while(pHand) { if(pHand-gt;suite != expected_suite) { return 0; } } return 1; }
Тогда вы бы вызвали его из основного кода следующим образом:
if(suitCheck(temp-gt;next, temp-gt;suite)) {
Я оставлю вам возможность представить, как выполнить то же самое, не изменяя сигнатуру функции.