【发布时间】:2022-01-07 17:01:00
【问题描述】:
所以我有一个链接列表,用于表示一手五张扑克牌。我正在尝试编写一个函数来检查卡片是否是皇家同花顺。我要做的第一件事是检查所有卡片的花色是否相同。下一点是我遇到麻烦的地方。我的想法是我会检查是否有任何牌是国王(13)。如果有一张,那么它会再次检查列表中是否有 Q、J、A 和 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->next;
}
}
}
int suitCheck(card* pHand) {
card* tmp;
tmp = pHand;
while (tmp != NULL) {
if (tmp->suit != tmp->next->suit) {
return(0);
}
tmp = tmp->next;
}
return(1);
}
我无法弄清楚如何从一张卡片移动到另一张卡片并检查每张卡片的正面是否具有正确的值。我也不确定这是否:tmp->next->suit 是编译器可以正确读取的东西。
【问题讨论】:
-
是的,
tmp->next->suit是编译器可以理解的。但如果你要这样做,循环应该是while (tmp != NULL && tmp->next != NULL)。 -
另一种方法是保存第一张牌的花色,例如
int suit = pHand->suit;然后检查每张卡片是否与该花色匹配。 -
手的花色都一样吗?这是第一步。如果您可以验证,请检查它是否包含必要的面卡。如果您知道它们都是相同的花色,您就不必担心找到两张任何面卡:例如。两个杰克,或两个皇后。
-
为了帮助您(和其他人)阅读您的代码,建议您为函数指定一个特定于它们所做工作的名称(通常是涉及动词的名称)。例如,
suitCheckdoes “检查”适合,但不清楚 什么 类型的检查。像isSameSuit这样的名字会更有意义。 -
您可以考虑使用的一种非常幼稚的方法是只计算一手牌中每种花色和价值的数量。这对于其他事情也将更加通用。因此,值的数组长度为 13,西装的数组长度为 4。然后,您遍历列表并增加相关的花色和价值计数器。现在很容易检查所有必需的卡都在那里。 ace 中只有一个“1”,10、J、Q、K 计数和其中一个花色计数中的 5。假设手中有 5 张牌。在这方面,将手表示为链表是很奇怪的。
标签: c function linked-list