在 7 张扑克牌中检测顺子

Detect Straight in 7-card poker hand

以下代码检查五张牌中的所有顺子(除了 5-high,我将其添加为 elif)

def straight(values,vset):
    if (max(vset) - min(vset) == 4) and numpair(values) == False and detset(values) == False and quads(values) == False:
#STRAIGHT DETECTED

Vset 只是一个包含值的集合。问题是,我想不出一种方法来调整此代码来评估 7 张德州扑克手牌。有什么建议吗?

我不知道代码现在是如何工作的,因为你还没有向我们展示 numpair()detset()quads() 的代码。

但是,从头开始,我会这样做:

# assume rank values are numeric 2-10, J=11, Q=12, K=13, A=14
# iterate over each rank 2 thru 10
for rank in range(2, 11):
    # if rank+0, rank+1, rank+2, rank+3, and rank+4 are all present, we have a straight
    if all(rank+n in vset for n in range(0,5)):
        print 'we have a straight'
        break
# if we never broke out of the loop, we never found a straight
else:
    print 'we do not have a straight'

虽然@JohnGordon 的解决方案有效,但它为每个等级值浪费性地迭代了 5 次。

一种更有效的方法是将排名从 2 迭代到 14,并简单地使用计数器来跟踪到目前为止排名连续存在于卡片中的次数,如果连续排名不存在存在,重置计数器。如果计数器达到 5,则确定有顺子。考虑到 A(这里假设其等级为 14)可以被视为 1 以与 2、3、4 和 5 形成顺子,您可以将 14 添加到 2 到 14 的范围内进行迭代:

count = 0
for rank in (14, *range(2, 15)):
    if rank in vset:
        count += 1
        if count == 5:
            print('Straight found')
            break
    else:
        count = 0
else:
    print('Straight not found')