1

我正在做的奇怪的小项目。在你回答之前,是的,我知道 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♣</p>

我的问题是,我应该尝试为此使用正则表达式吗?在不硬编码每只手的情况下,告诉计算机他有哪只手的最佳方法是什么?

编辑:这里的完整代码:https ://codereview.stackexchange.com/questions/21338/how-to-tell-the-npc-what-hand-it-has

4

1 回答 1

1

扑克牌都取决于牌的相对等级和/或花色。

我建议编写一些实用函数,从确定等级和花色开始。

因此,您的代表中的一张牌是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 单元:赢得扑克牌

于 2013-02-05T20:33:30.703 回答