我决定通过创建一个扑克游戏来挑战自己。我目前对元组非常困惑,并试图正确使用它们。我目前正试图检查手(h(是否是直冲的。下面是我用来创建一副牌的代码。
numbers=(2,3,4,5,6,7,8,9,10,'J','Q','K','A')
faces=("Clubs","Diamond","Spades","Harts")
print(numbers[0],faces[0])
deck=[]
for i in numbers:
for j in faces:
deck.append((j,i))
hand=d[1],d[5],d[9],d[13],d[17]
上面的手是(('Diamond', 2), ('Diamond', 3), ('Diamond', 4), ('Diamond', 5), ('Diamond', 6))
。
以下是我遇到问题的代码。目前,它只能检查所有的面是否相同(它可以检查Diamond是否是h中所有牌的面(,但不能检查数字是否与数字顺序一致。此外,我想让它使A
可以循环,因为像(('Diamond', 2), ('Diamond', 3), ('Diamond', 4), ('Diamond', 5), ('Diamond', A))
这样的手仍然是有效的直我知道我可以用数字来检查序列,但我试着只使用deck
def straight_flush(h):
r=True
for (i,j) in h:
for (a,b) in h:
if i==a:
r=True
else:
r=False
return r
print(straight_flush(h))
首先,使用数字作为面牌。这更容易。此外,你应该制作一个卡片类。
关于直冲,你需要检查手是否是直冲,然后检查直冲卡。使用5张牌的手牌(而不是像Hold’em中的7张牌(意味着你只需要检查是否有直牌和齐平牌。
冲洗很容易检测,只要看看任何套装的数量是否≥5。直道有点难。可能最简单的方法是在所有直道中手动编码(即检测手是否匹配表示可能直道的预设元组(。
也有检测直线的算法。这是我为给你一个结构概念而做的一个项目:
def straight(cls, vset, get_vals=False):
"""Returns the name of a straight hand (string) given a set of the hand's card values.
Returns False if a straight is not present within the hand. Also changes hand strength accordingly.
If get_vals is true, straight() does not change strength and returns the values present in a straight."""
count = 0
if not get_vals:
straight = False
for rank in reversed([14, *range(2, 15)]):
if rank in vset:
count += 1
min_c = rank
if count == 5:
if min_c != 14:
max_c = min_c + 4
else:
min_c, max_c = 1, 5
cls.strength = BaseStrength.STRAIGHT.value + 70*max_c
straight = f'Straight from {value_names[min_c]} to {value_names[max_c]}'
break
else: count = 0
return straight
忽略get_vals
。我的算法不是最有效的(可能远非如此(。