我正在做的奇怪的小项目。在回答之前,是的,我知道vbscript可能是最糟糕的语言。
我需要帮助确定每位球员的身份。每张牌都有一个唯一的号码(我将其翻译成扑克价值,旁边有一张♥♦♣))。例如:
A♥ = 0
2♥ = 1
3♥ = 2
...
等等。我需要帮助确定我的手牌。我想过几个方法。第一种是使用每个卡值之间的增量。例如,直线将是:
n
n +/- (1+ (13 * (0 or 1 or 2 or 3)))
n +/- (2 + (13 * (0 or 1 or 2 or 3 )))
...
等等。例如卡3,3 + 1 + 0,3 + 2 + 13,3 + 3 +(13 * 3),3 + 4 +(13 * 2)
会给我: 4♥5♥6♦7♠8♣
我的问题是,我应该尝试使用正则表达式吗?什么是告诉电脑他没有硬编码每手牌的最佳方法?
编辑:此处的完整代码:https://codereview.stackexchange.com/questions/21338/how-to-tell-the-npc-what-hand-it-has
答案 0 :(得分:1)
扑克手牌全部取决于牌的相对等级和/或套装。
我建议编写一些实用函数,从确定等级和套装开始。
因此,您的代表中的卡片是0 {51的int
。以下是一些有用的函数(伪代码):
// 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单元:获胜扑克手Design of Computer Programs