VBScript扑克游戏 - 我有什么手牌?

时间:2013-02-05 14:38:38

标签: vbscript poker

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

1 个答案:

答案 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