扑克牌都取决于牌的相对等级和/或花色。
我建议编写一些实用函数,从确定等级和花色开始。
因此,您的代表中的一张牌是int
从 0..51 开始的。以下是一些有用的功能(伪代码):
// returns rank 0..12, where 0 = Ace, 12 = King
getRank(card) {
return card % 13;
}
// returns suit 0..3, where 0 = Heart, 1 = Diamond, 2 = Club, 3 = Spade
getSuit(card) {
return card / 13; // or floor(card / 13) if lang not using floored division
}
现在您可以获得一组牌的等级和花色,您可以编写一些实用程序来处理它们。
// sort and return the list of cards ordered by rank
orderByRank(cards) {
// ranked = []
// for each card in cards:
// get the rank
// insert into ranked list in correct place
}
// given a ranked set of cards return highest number of identical ranks
getMaxSameRank(ranked) {
duplicates = {} // map / hashtable
for each rank in ranked {
duplicates[rank] += 1
}
return max(duplicates.vals())
}
// count the number of cards of same suit
getSameSuitCount(cards) {
suitCounts = {} // a map or hashtable if possible
// for each card in cards:
// suitCounts{getSuit(card)} += 1
// return max suit count (highest value of suitCounts)
}
您将需要更多实用函数,但有了这些,您现在可以寻找同花或顺子:
isFlush(cards) {
if (getSameSuitCount(cards) == 5) {
return true
}
return false
}
isStraight(cards) {
ranked = orderByRank(cards)
return ranked[4] - ranked[0] == 3 && getMaxSameRank(ranked) == 1
}
isStraightFlush(cards) {
return isFlush(cards) && isStraight(cards)
}
等等。
一般来说,你需要对照可能的牌检查每手牌,从最好的开始,一直到高牌。在实践中,您将需要更多的东西来区分平局(两名玩家有满堂彩,获胜者是排名较高的三人满堂彩)。因此,您需要存储更多信息来对两只手牌进行排名,例如起脚牌。
// simplistic version
getHandRanking(cards) {
if (isStraightFlush()) return STRAIGHT_FLUSH
if (isQuads()) return QUADS
...
if (isHighCard) return HIGH_CARD
}
getWinner(handA, handB) {
return max(getHandRanking(handA), getHandRanking(handB))
}
那将是我的一般方法。有大量关于扑克手牌排名算法的信息。您可能会喜欢 Peter Norvig 的 Udacity计算机程序设计课程中的第 1 单元:赢得扑克牌