多次调用函数并获得新结果

时间:2019-07-19 22:54:20

标签: python simulation poker

我想创建一个扑克模拟游戏,创建一定数量的5张牌扑克手,以查看在获得皇家同花顺之前我需要玩多少手...

我编写了一个生成5张卡的函数,但是当我多次运行该函数将无法正常工作->我得到5 * x张卡,而不是每5张卡多手

import random

d = []
h = []

def cards():

    l1 = ["Herz", "Karo", "Pik", "Kreuz"]
    l2 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
    for i in range(10):
        d.append([])
    for k in range(10):
        d[k].append(l1[random.randint(0, (len(l1) - 1))])
        d[k].append(l2[random.randint(0, (len(l2) - 1))])
    for a in d:
        if a not in h:
            h.append(a)
            if len(h) == 5:
                break
        else:
            continue
    return h

for i in range(2):
    print(cards())

运行代码时,我得到以下信息:

  

[[['Karo',8],['Herz',5],['Pik',13],['Herz',12],['Karo',3]]

     

[[['Karo',8,'Karo',5],['Herz',5,'Karo',6],['Pik',13,'Herz',   4],['Herz',12,'Herz',5],['Karo',3,'Pik',3],['Karo',8   'Kreuz',3],['Karo',9,'Kreuz',3],['Pik',13,'Herz',10],['Pik',   6,'Karo',11],['Karo',2,'Pik',13],[]]

1 个答案:

答案 0 :(得分:3)

您的代码当前具有全局列表,并且该列表始终附加到该列表中。几乎可以肯定这不是您想要的。

我建议创建一副纸牌,并在不更换的情况下对它们进行采样,得到五张纸牌。您最多可以从52张牌中抽出10张这样的手。更好的方法可能是创建卡片组并对其进行洗牌,一次拾取5张卡片,直到少于5张卡片为止。

在任何一种情况下,您都可以将每只手传递给一个测试其是否是同花顺或其他所需功能的函数。

为此所需的所有工具(直到您使用numpy)都在itertoolsrandom模块中。

首先创建一个全局套牌。无需多次执行此操作,因为它会使您毫无目的地慢下来。卡组不会改变,只有它们的顺序会改变:

rank = [str(x) for x in range(2, 11)] + list('JQKA')
suit = list('♠♥♦♣')
deck = list(''.join(card) for card in itertools.product(rank, suit))

现在,您可以使用该卡片组一次生成1到10张牌,并且它们之间没有重复的牌。关键是在甲板上进行洗牌是正确的。您不必每次都重新生成卡片组:

def make_hands(cards=5, hands=None):
    if hands is None:
        hands = len(deck) // cards
    if cards * hands > len(deck):
        raise ValueError('you ask for too much')
    if cards < 1 or hands < 1:
        raise ValueError('you ask for too little')
    random.shuffle(deck)
    result = [deck[cards * i:cards * i + cards] for i in range(hands)]

您可以使用此功能更改每只手和每副牌的所需张数。假设您还有一个函数可以检查手牌是否同花或不叫isflush。您可以这样应用它:

def how_many():
    shuffles = 0
    hands = 0
    while True:
        shuffles += 1
        cards = make_hands()
        for hand in cards:
            hands += 1
            if isflush(hand):
                return shuttles, hands

shuffles, hands = how_many()
print(f'It took {hands} hands with {shuffles} reshuffles to find a flush')