Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在7张扑克牌中直接检测_Python_Poker - Fatal编程技术网

Python 在7张扑克牌中直接检测

Python 在7张扑克牌中直接检测,python,poker,Python,Poker,以下代码检查五张牌中的所有直牌(除了5高,我将其作为elif添加) Vset只是一个包含值的集合。问题是,我无法找到一种方法来调整此代码以评估7张牌的holdem牌。有什么建议吗?我不知道代码现在是如何工作的,因为您还没有向我们展示numpair()、detset()和quads()的代码 然而,从一张白纸开始工作,我会这样做: # assume rank values are numeric 2-10, J=11, Q=12, K=13, A=14 # iterate over each ra

以下代码检查五张牌中的所有直牌(除了5高,我将其作为elif添加)


Vset只是一个包含值的集合。问题是,我无法找到一种方法来调整此代码以评估7张牌的holdem牌。有什么建议吗?

我不知道代码现在是如何工作的,因为您还没有向我们展示
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'

我不知道代码现在是如何工作的,因为您还没有向我们展示
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,则确定存在直线。考虑到Ace(此处假设其排名为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')

尽管@JohnGordon的解决方案有效,但对于每个秩值,它会浪费5次迭代

一种更有效的方法是将等级从2迭代到14,并简单地使用计数器来跟踪到目前为止等级连续存在于卡中的次数,如果连续等级不存在,则重置计数器。如果计数器达到5,则确定存在直线。考虑到Ace(此处假设其排名为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')

numpair、detset和quads确定是否存在对、集或quads。不管怎样,您的代码都可以工作。编辑为使用
all()
而不是笨重的内部循环。您缺少边缘大小写。王牌在逻辑上被直接评估为1或14。@selbie我以为王牌在扑克中总是很高的?我已经很久没玩了。牌:a,2,3,4,5是一个直牌,最高的牌是5。我会全力以赴。numpair、detset和quads决定是否有对、集或quads。不管怎样,您的代码都可以工作。编辑为使用
all()
而不是笨重的内部循环。您缺少边缘大小写。王牌在逻辑上被直接评估为1或14。@selbie我以为王牌在扑克中总是很高的?我已经很久没玩了。牌:a,2,3,4,5是一个直牌,最高的牌是5。我完全同意。你的问题有很多问题:首先,你的数据类型是什么?第二,有几个未定义的函数。第三,“我搞不懂”几乎不是一个问题描述。在任何情况下,这些代码在我看来都很不符合实际,所以我就从重构开始。也许,一旦代码变得更加清晰,解决方案就会变得更加明显。在任何情况下,添加单元测试!你的问题有很多问题:首先,你的数据类型是什么?第二,有几个未定义的函数。第三,“我搞不懂”几乎不是一个问题描述。在任何情况下,这些代码在我看来都很不符合实际,所以我就从重构开始。也许,一旦代码变得更加清晰,解决方案就会变得更加明显。在任何情况下,添加单元测试@布莱辛:射程(2,15)在做什么?不确定迭代的前置是什么
range(2,15)
创建一个range对象,该对象将产生从2到14的数字,而解包操作符
*
range(2,15)
的输出解包到一个由外圆括号括起的元组中,以及它前面的14(这就是前置的意思),形成一个要迭代的
(14,2,3,4,…,13,14)
元组。我认为我没有正确理解?那不是把13,14,2,3,4注册为一条直线吗?不是的,因为它只在计数器达到5时才识别一条直线,而且由于
rank
是从14,2,3,4,…,迭代到13,14,如果卡中有14,2,3,4,5,5或2,3,4,4,5,5,6,7,…,或10,11,12,13,14,计数器只能达到5。拥有13、14、2、3、4不会使计数器达到5,因为
rank
不会按该顺序迭代。@blhsing*range(2、15)在做什么?不确定迭代的前置是什么
range(2,15)
创建一个range对象,该对象将产生从2到14的数字,而解包操作符
*
range(2,15)
的输出解包到一个由外圆括号括起的元组中,以及它前面的14(这就是前置的意思),形成一个要迭代的
(14,2,3,4,…,13,14)
元组。我认为我没有正确理解?那不是把13,14,2,3,4注册为一条直线吗?不是的,因为它只在计数器达到5时才识别一条直线,而且由于
rank
是从14,2,3,4,…,迭代到13,14,如果卡中有14,2,3,4,5,5或2,3,4,4,5,5,6,7,…,或10,11,12,13,14,计数器只能达到5。拥有13、14、2、3、4不会使计数器达到5,因为
rank
不会按该顺序迭代。