Протестируйте 5-карточную комбинацию на каре

Я пытаюсь проверить комбинацию из пяти карт, чтобы увидеть, включает ли она каре. В настоящее время у меня есть две функции: convert(x) и draw_n(n). Они определяются как:

def convert(x):
    card = x % 13
    suit = 'SHDC'[x/13]
    return card, suit, str([card, suit])

def draw_n(n):
    from random import sample

    # initialize the list
    cards = []
    # make sure that we have a valid number
    if n > 0 and n <= 52:
        # sample without replacement 
        for x in sample(xrange(0, 52), n):
            # append the converted card to the list
            cards.append(convert(x))
    return cards

Когда draw_n(n) выполняется с параметром 5 (т. е. вытягивает руку из 5 карт), он возвращает список с 5 случайными картами, который выглядит следующим образом:

[(8, 'D', '9 of Diamonds'),
 (0, 'H', 'Ace of Hearts'),
 (8, 'H', '9 of Hearts'),
 (10, 'S', 'Jack of Spades'),
 (12, 'C', 'King of Clubs')]

Цифра относится к номеру карты (т. е. 0 = туз, ..., 12 = король), буква относится к масти, а строка — к названию карты.

Я буду выполнять эту функцию несколько раз в Python, что приведет к множеству рук из 5 карт. Я хотел бы иметь возможность подсчитать количество рук с каре в списке 5-карточных рук, но мне не повезло. Любая помощь будет принята с благодарностью!


person jwp0025    schedule 21.09.2015    source источник
comment
Я пытался использовать функцию «разделить и разбить», чтобы получить строку карты (т. е. «9 червей» и т. д.) саму по себе, но мне не повезло.   -  person jwp0025    schedule 22.09.2015


Ответы (3)


Таким образом, вам нужна только функция, чтобы сказать вам, является ли это каре. Что-то вроде этого должно делать:

def is_four_of_a_kind(hand):
    hand = sorted(hand)
    # assumes length >= 5
    return hand[0][0] == hand[3][0] or hand[1][0] == hand[4][0]

Я рекомендую всегда сортировать руки (по достоинству карты), это значительно упрощает процесс определения того, какая у вас рука.

Теперь используем его в полученном количестве рук:

hands = [draw(5) for _ in xrange(1000)]
four_of_a_kinds = [hand for hand in hands if is_four_of_a_kind(hand)]
four_of_a_kinds_count = len(four_of_a_kinds)
person Reut Sharabani    schedule 21.09.2015
comment
это классный способ проверить четыре вида... Мне пришлось много думать об этом... (что глупо, потому что это не очень запутанно) - person Joran Beasley; 22.09.2015
comment
Я написал игру в покер на питоне, это экономит много времени во многих местах (сортировка рук). - person Reut Sharabani; 22.09.2015
comment
Если вы используете функцию из более универсального оценщика рук, не выполняйте сортировку внутри функции. Отсортируйте раздачу один раз, затем позвольте функциям принять отсортированный порядок (возможно, утвердите его). Это значительно ускорит вас. - person Lee Daniel Crocker; 23.09.2015
comment
@LeeDanielCrocker это было моим намерением, я рекомендую всегда сортировать руки (по номиналу карты) .... Очевидно, вам нужно сортировать один раз. - person Reut Sharabani; 23.09.2015

from operator import itemgetter
from collections import Counter
any(v==4 for k,v in Counter(v[0] for v in my_hand).items())

это способ сделать это...

person Joran Beasley    schedule 21.09.2015
comment
Элегантный и почти но (во всяком случае, Py3.x) не совсем способ сделать это. Я не получаю аргумент ключевого слова key для Counter (выдает ошибки), и в любом случае вам нужен счетчик items(). Это делает это: any(v == 4 for v, k in Counter(map(itemgetter(0), my_hand)).items()) - person BrianO; 22.09.2015

У вас уже есть ранг карты в первом элементе тройки.

rank_count = 13*[0]
for card in hand:
   rank = int(card[0])
   rank_count[rank] += 1

if 4 in rank_count:
   # you have a 4-of-a-kind
person Prune    schedule 21.09.2015