如何从 4 位玩家之间的 9 张牌中找出最高的牌?

Posted

技术标签:

【中文标题】如何从 4 位玩家之间的 9 张牌中找出最高的牌?【英文标题】:How can I find the highest poker hand from a 9 card hand between 4 players? 【发布时间】:2013-05-09 19:31:14 【问题描述】:

我尝试在网上查看了几个资源,它们都处理 5 张牌和 7 张牌手。另外,我并不是真的在寻找代码,我会尝试自己做(尽管如果你愿意,我希望在 Python 或 javascript 中实现它)。我只是希望有人向我解释找到这样一只手所涉及的步骤(使用伪代码)。

基本上,我要问的是:

我是否应该只分配排名中所有最高的扑克手牌号码,然后解析每个玩家的手牌,看看他们的手牌是否包含该号码?这似乎有点乏味,我不确定这是正确的方法。

另外,我注意到其他手牌评估器已设置为优化,有些人会计算每张牌的位数,这让我感到困惑。

编辑:这是我正在开发的游戏:

这是一个 6x6 网格的游戏,其中四名玩家拿起卡片,无论他们的玩家棋子落在哪里,他们都会拿起那张卡片。卡片来自标准的 52 张卡片组,但卡片正面朝上,仅使用从卡片组中随机选择的 36 张卡片。

最终,在游戏快结束时,玩家最多可以拥有 9 张牌。

赢得比赛的方法是在您周围的四名玩家中控制最高的扑克手。

所以,本质上,如果你有皇家同花顺而其他人有对子或顺子,他们就输了。

在另一场游戏中,最高的手牌是顺子,其余的牌是三对子或二对子,那么拿到顺子的人获胜。

因此,最高牌手是相对于其他玩家手牌最高的手牌。它是 4 位玩家中排名最高的手牌。

扑克牌只是普通牌,可能是也可能不是排名最高的。

【问题讨论】:

定义poker handhighest poker hand @Kabie,我注意到我可能不清楚。请参阅上面的编辑。谢谢! 所以一只手最多只能使用5张卡,对吧? @Kabie,这取决于您所说的用途。游戏结束时,最多 9 张牌中只有 5 张牌(构成可能的扑克牌,无论高与否)在您的手上进行评估。 基本上,我必须解析一手 9 张牌,看看它是否包含一手 5 张牌。如果手牌中有 5 张牌,则将其隔离,以便在其他 4 位玩家之间进行评估和比较。 【参考方案1】:

对于 9 张牌,只有 126 种可能的 5 张牌组合。因此,您可以遍历它们以找到最高值。 itertools.combinations(9_cards, 5) 可以全部生成。

要找到最高的,可以定义一个给手打分的函数。然后使用这个函数作为key:max(all_5_cards_hands, key=hand_score)

您可以使用元组来表示分数。手牌排名领先,卡牌排名次之。

一个例子:

STRAIGHT_FLUSH = 9
...
TWO_PAIR = 2
ONE_PAIR = 1
HIGH_CARD = 0

hand_score('A7532')  # I omit suits here
# => (HIGH_CARD, 14,7,5,3,2)
hand_score('KK333')
# => (FULL_HOUSE, 3, 13)
hand_score('33444')
# => (FULL_HOUSE, 4, 3)
hand_score('AKQJ0')
# => (STRAIGHT, 14)

# Tuples can be easily compared:
(HIGH_CARD, 14,7,5,3,2) < (STRAIGHT, 14)
# => True

【讨论】:

嗯,我明白了。我会尝试一下,看看我是否可以到达任何地方。非常感谢@kabie。顺便说一句,如果手牌总数少于 9 张怎么办。例如,在游戏中,某人可以移动到一个没有牌且该回合没有收到牌的空间。因此,该玩家可能有 8 张牌而不是 9 张牌。另一个玩家最后可能有超过 10 张牌。所以,我只是想,让我们笼统地说,如果一个玩家可以有 x 数量的牌,而那手牌中可能有 5 张牌呢? 还有一件事,我如何引用扑克手牌最高的玩家? @Kaylie:9_cards 是这里的玩家。 C(14,5) 是 2002。所以它仍然是可计算的。所以你可以用手替换9_cards。参考播放器。普通的方法可能只是将highest_hand 分配为Player 的属性(我假设您使用一个类来表示播放器?)。或者让它成为一个类方法。 是的,我有一个类来代表玩家。非常愚蠢的愚蠢问题,但我如何将最高手指定为玩家的属性。可以举个例子吗? @Kaylie:假设你有player1 = Player(),那么player1.highest_hand=some_hand 就可以了。

以上是关于如何从 4 位玩家之间的 9 张牌中找出最高的牌?的主要内容,如果未能解决你的问题,请参考以下文章

UVA 12298 Super Poker II(FFT+母函数)

推断5张扑克牌的组成

扑克牌里的MapReduce算法

2021-3-17-字节-胡牌

2021 ICPC上海 I.Steadily Growing Steam(dp)

2021 ICPC上海 I.Steadily Growing Steam(dp)