Я написал несколько кодов для покера, некоторые из которых были для класса программирования, который я преподавал.Одна вещь, которую я узнал, состоит в том, что, не обращая внимания на ответ @ mneedham, лучше всего представлять карту как число от 0 до 51. Это имеет много преимуществ с точки зрения того, как вы обрабатываете 5-карточную руку.для конкретных комбинаций.
Если две карты, представленные в виде числа от 0 до 51, совпадают по рангу, то их число, измененное на 13, будет одинаковым.Таким образом, вы можете сделать что-то подобное, чтобы оценить руки с соответствующим рангом:
def evaluate_hand(cards):
# build a list of lists for collecting cards of the same rank
ranks = []
for i in range(13):
ranks.append([])
# put each card in the appropriate rank list
for i in cards:
ranks[i % 13].append(i)
# Sort our rank list descending by sublist length
ranks = sorted(ranks, key=len, reverse=True)
# Show what we end up with
print(ranks)
# Now show what we've got
if len(ranks[0]) == 4:
print("Four of a kind")
elif len(ranks[0]) == 3 and len(ranks[1]) == 2:
print("Full house")
elif len(ranks[0]) == 3:
print("Three of a kind")
elif len(ranks[0]) == 2 and len(ranks[1]) == 2:
print("Two pair")
elif len(ranks[0]) == 2:
print("Pair")
else:
print("Nada")
evaluate_hand([31, 4, 23, 17, 30])
evaluate_hand([36, 4, 23, 17, 30])
evaluate_hand([36, 4, 23, 19, 30])
evaluate_hand([4, 5, 6, 7, 8])
Результат:
[[4, 17, 30], [31], [23], [], [], [], [], [], [], [], [], [], []]
Three of a kind
[[4, 17, 30], [36, 23], [], [], [], [], [], [], [], [], [], [], []]
Full house
[[4, 30], [36, 23], [19], [], [], [], [], [], [], [], [], [], []]
Two pair
[[4], [5], [6], [7], [8], [], [], [], [], [], [], [], []]
Nada
Чтобы распознать флеш, проверьте, все ли 5 значений карт, разделенные на 13, даюттот же номер.Чтобы распознать стрит, создайте список значений каждой карты, модифицированных 13 (создайте список рангов), отсортируйте их, а затем убедитесь, что полученные числа являются последовательными.Если оба эти теста пройдены, у вас стрит-флеш.Я оставлю вам код этих чеков.
Получить костюм на любое число очень просто:
def show_suit(card):
print(['Diamond', 'Heart', 'Spade', 'Club'][int(card / 13)])
Так же и получить названный ранг:
def show_rank(card):
rank_names = { 0: 'Ace', 10: 'Jack', 11: 'Queen', 12: 'King'}
rank = card % 13
print(rank_names[rank] if rank in rank_names else rank)